日期:2014-05-16  浏览次数:20347 次

JavaScript的一些困惑

定义一个全局变量,一个函数调用此变量,如下:

var s = 123;
function tst(){
alert(s);
?s = 456;
alert(s);
}
alert(s);

执行后为:

123

123

456

如果写成如下格式:

var s = 123;
function tst1(){
alert(s);
var?s = 456;
alert(s);
}
alert(s);

执行后为:

123

undefined

456

???? 为什么下面这个会是这样的结果呢?

???? 按照abruzzi的《Javascript Core v0》上所说为:

???? Javascript的函数是在局部作用域内运行的函数体可以访问其外层的(可能是全局作用域)变量和函数。javascript的作用域为词法作用域所谓词法作用域,其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定。

???? 具体到这个例子,那就是:因为在函数tst1的定义中,预先访问了未声明的变量s,然后才对s变量进行初始化,所以第一个alert(s)会返回undefined,那为什么函数这个时候不访问外部的s变量呢?这是因为,在词法分析结束后,构造作用域链的时候,会将函数内定义的var变量放入该链,因此s在整个tst1内都是可见的(从函数体的第一行到最后一行),由于s变量本身是未定义的,程序顺序执行,到第一行就返回undefined,第二行为s赋值,所以第三行返回456。

?