要理解变量的范围,首先要理解变量链。
当使用var关键字声明变量时,属性会添加到变量所在的对象中。
范围链:因为JS的变量都是对象的属性,而对象可能是其他对象的属性,它们都是窗口对象的属性,所以这些对象之间的关系可以看作是一个链。
链头是变量的对象,链的尾部是窗口对象。

请看下面的代码:
复制代码代码如下所示:
函数t(){
VaR;
函数T2(){
VaR B;
}
}

js中的函数也是一个对象,所以变量a所在的对象是t,t在窗口对象中,所以A的链如下所示
T——窗
所以B的对象是T2,T2包含在T中,T在窗口对象中,所以B的链如下所示
T2 - T -窗口
理解范围链下开始变量的范围分析
1个没有var的Javascript变量是全局变量,是窗口对象的属性。
复制代码代码如下所示:
函数test1(){
执行此语句时,它将找到作用域对象,该函数的第一个对象是范围链,而不是var语句的对象。
要查找第二个对象的范围链,即全局对象,全局对象不相关var语句
由于没有相关的var语句,js隐式声明var函数中的所有变量;
全部= 30;
警报(全部);
}
test1();
警报(全部);
警报(窗口全部);

在2个函数中定义的变量(除了函数中的函数)在整个函数中是有效的。
复制代码代码如下所示:
功能test2(){
var = 0;
在为条件的条件下定义的变量,范围链是这个更改函数的对象。
因此,在整个功能中,它是有效的。
对于(var i = 0;i < 5;i + +){
T=i;
}
警报(一);
}
test2();

3个函数中的变量替换了全局同名变量。
复制代码代码如下所示:
var;
函数测试(){
当执行t时,它将首先找到范围链对象,因为它是在函数中定义的,因此这个函数是它的范围链第一个对象。
在这个对象和t的定义中,T是一个局部变量,它替换了全局变量t。
这个时间只定义,但是没有赋值,任务在下一行,所以这里是未定义的输出。
警报(T);
var;
警报(T);
}
测试();

4非阻塞范围
复制代码代码如下所示:
如果(真){
在块中定义的变量,第一个对象范围链,它是全局对象窗口。
var = 0;
}
第一个对象的作用域是全局对象窗口,它在全局对象中有一个相关的var语句,因此输出0。
警报(TMP);


以下内容来自在线博客摘要。使用笔记时,我们只注意它们。同时,非常感谢那些愿意与你分享的博客作者。你把我放在巨人的肩膀上。
1,
复制代码代码如下所示:
var =(函数(){())
测试;
返回函数(){
警报(名称);
}
});

上面的代码片段是我们经常看到jser,传奇关闭。众所周知,温度()称为;测试将破裂;过程可以通过以下三个理论解释:

1)js作用域只与函数的定界符相关,函数和函数的嵌套形成动作链。
2)范围链的创建规则是复制环境上层并将指针指向环境对象到链头的范围链。
3)在Javascript中,如果一个对象不再被引用,那么对象将被GC回收。如果两个对象互相引用并且不再被第三引用,那么这两个相互引用的对象将被回收。

如果您不理解上面的3,您可以通过理论的结合来看到代码的下一个详细解释:
首先,执行的外部函数,但范围链被破坏;外部函数复制到作用域链的内在功能,由内部函数的作用域链的一部分,请记住,它是不可复制,引用(二),使内部的功能仍然可以访问的名;因为内部函数返回的是一个参考温度,所以当外部函数完成的是破坏,而作为外部函数的一部分内部功能,但仍存在第三的基础是第三参考;封闭的传说也这是科学的