今天,一个实习的小妹妹问我这两个js代码的区别。

代码1:



var;
函数测试(){
VaR;
警报(a);
a 世界;
警报(a);
}



代码的两:



var;
函数测试(){
警报(a);
a 世界;
警报(a);
}





我想这很容易,不是全局变量和局部变量的范围问题吗我说:当全局变量名为局部变量时,局部变量作用域将覆盖全局变量范围,当离开局部变量作用域,并返回到全局变量范围时。因此,两段代码的结果如下:1)未定义的世界2)Hello World。



var a=1;
函数测试(){
警报(a);
var a=2;
警报(a);
}
测试();
警报(a);



你猜结果是什么它的输出是121吗好吧,当我把测试用例放在她面前,这样想,但在测试输出之后……运行结果是不确定的21。当时,尽管有很多想法,仍然困惑,问山谷老师知道,我的JS不是很理解,所以努力学习和测试,总结如下:

Javascript,变量作用域是基于块划分(由一对大括号{函数}来划分)。记住,它是函数块,for,if和if块不是操作范围的标准,你可以看到下面的例子:



功能test2(){
警报(前范围:+我); / /我(未分配的任何声明!用一个未声明的变量或函数从一个致命错误中抛出,中断脚本执行。

这是我的价值 / /不确定性
对于(var i = 0;i < 3;i + +){
警报(在范围:+ i);0, 1, 2是i的值,当我在循环中为3时
}
警报(范围之后:+ i); 3,是i的值,现在在范围内,但我仍然保留为3。

当(真){
var j=1;
打破;
}
警报(j);1,是j的值,现在在作用域,但j仍然保留为1。

如果(真){
var = 1;
}
警报(k);值是1,注意它现在在IF范围之外,但是k的值仍然是1。
}

test2();
如果在这个时候(功能/范围)的输出只存在于test2这个功能范围I,J,K的变量会发生什么样的影响
警报(i);错误!是的,这是错误。原因是我没有宣布变量(不分配价值,这是个函数的第一行输出),从而导致脚本错误,以及程序的终结。
警报这行打印出来吗;未执行
警报(j);未执行
警报(k);未执行



第二,Javascript将在执行前对整个脚本文件(包括本地变量)的声明进行全面分析,从而确定真实变量的范围。您如何理解它请看下面的例子:



var a=1;
函数测试(){
警报(a);未定义的!这不是一个全局变量,这是因为函数作用域已经声明(从底部的函数第四行)一个本地变量名,
因此,全局变量a被覆盖,这表明执行前的Javascript将对脚本文件定义的整个部分进行完整的分析,因此在执行之前的函数测试(),
在函数体中指向变量一个内部变量。全局变量而不是指向外部。但是当A不仅是语句,赋值,也就是未定义的输出。
= 4
警报(A);A是4,没有悬念这是一个局部变量。
在这个语句中的一个局部变量
警报(a);a仍然是4,因为它已经给4了一个
}
测试();
警报(a);a是1,它不在函数作用域中,a的值是全局变量的值。



三,当全局变量名带有局部变量时,局部变量作用域将覆盖全局变量范围,当离开局部变量范围时,返回到全局变量范围,当全局变量在局部变量中时,如何使用全局变量使用window.globalvariablename。



var a=1;
函数测试(){
警报(窗口A);A是1,A是全局变量。
var = 2;这个定义中的本地变量
警报(a);a是2,A是本地变量。
}
测试();
警报(a);a是1,它不在函数作用域中,a的值是全局变量的值。



当然,更多的文章可以参考以下文章。