JavaScript作用域链
【JavaScript作用域链】大多数语言里面都会使用{}
来形成一个作用域,俗称块级作用域。JavaScript中{}
没有带来块级作用域,JavaScript的作用域是靠函数来形成的,也就是说一个函数内定义的变量,函数外不可以访问。
function fn() {
var a =1;
if(a > 2) {
var b = 3;
}
console.log(b);
}
fn();
//undefined
console.log(a);
//输出undefined
有了作用域的概念,函数间的层层引用时,每个变量所属的作用域都是确定的,那同名的变量应该如何确定引用关系呢?比如:
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn() //输出2
为什么最后输出是2?当某个函数被调用时,会创建一个执行环境及相应的作用域链。fn2执行时,作用域链是:fn2() -> fn3() -> window。fn2内部没有定义变量a,所以会从它声明的环境中查找,而不是调用的环境。所以找到的是var a = 2;
解密:
- 函数在执行的过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
- 注意找的是变量的当前的状态
P.S. 声明提前在作用域下同样适用。复杂情况一定要考虑进去。
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 事件代理
- 「#1-颜龙武」区块链的价值是什么()
- leetcode|leetcode 92. 反转链表 II
- 数组常用方法一
- BNC公链|BNC公链 | Eth2.0测试网Topaz已质押超100万枚ETH
- 【#2-戴栋】区块链可以提升哪些商业上的效率改进
- 父母链接八~未了情结
- java|java 常用知识点链接