Javascript范围的再探索

《黄金密码》的第一篇文章:

js没有块级作用域(可以通过自己或其他方法关闭)。只有函数级范围,函数可以在变量之外找到,函数内部的变量不能在外部找到。

第一次尝试:



为什么会这样


var a=10;
功能AAA(){ / / step-4
警报(一); / / step-5 ->执行警戒,此时才发现外面= 10,所以弹盒10
}
功能BBB(){ / / 2
var a=20;
AAA(); / / STEP - 3
}
/ /定义函数的调用是无用的,所以这里是步步房
血脑屏障(); / /步步


事实上,每个人都应该理解这个原则,它容易出错,从顶部改变。

二试:



为什么会这样因为当B被分配到A时,B还没有被定义,所以A是未定义的,B是10。

第二密码:

变量的查找是最近的原则,寻找var定义的变量,并在未找到的时候寻找外层。

看:



为什么会这样这其中有两个原因,一是preparsing,和两个是附近搜索。


var a=10;
函数AAA(){
警报(a);未定义的。当寻找A时,它会在函数中找到。由于预解析的功能,A在此时是未定义的,所以它永远不会寻找外部的10个。
var a=20;

前/分析
VaR
警报(a);
var = 20;*

}
(AAA);




注意:



这证实了第二个,虽然这是一个接近的规则,它的附近寻找var声明的变量,这是因为没有var声明的变量是全局的,它只能对A的值,上面的是因为一个VaR不在功能的发现,让我们去寻找它,一眼就找到它,所以会得到10的警戒;但是,后一个是20 = 20,的确,但警报尚未执行的。

看看它。



下面的示例是对js函数域的更详细的验证:



这是因为在警报(a)时,A的BBB功能是20,但它是为警报(a)这一句是警报的一部分(A)找不到BBB函数的A,所以AAA函数找不到A,然后找出,查找,找到10。

金码第三:

当具有本地变量名的参数时,优先级是相同的。

例:



还有:当引用被传递时,基本类型传递值,引用类型被引用。


var a=5;
var;
B+=3;
警报(a);5

var a = {1,2,3};
var;
B.push(4);
警报(一); / / {三};


上面的代码没有问题,但它不一样。



因为B是分配不点A.

此外,参数的范围类似于变量。



相比之下,这两个:



以上是参数是基本类型,并且只传递值,并传递以下类型的引用:(还包含重新分配的情况)。