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。
仔细思考,解惑啊。