JavaScript作用域划分和Python一样,都是以一个函数作为一个作用域。而其他语言如c,c++等,是以代码块为作用域,而每一对花括号代表一个代码块。
JavaScript作用域具有4个特性:
1、以函数作为作用域。
2.函数的作用域在函数未被调用前已经创建。
3.函数的作用云存在作用域链,且也在被调用前创建。
4.函数内局部变量提前已经声明。
作用域链 用下例说明:
name='Beauty'; function func(){ var name='Alice'; function inner(){ console.log(name); } var name='Jack'; return inner; } re=func(); re();
re=func()执行fun函数。返回inner. 则re=inner re()也就是执行inner(), 打印name,inner函数中没有name,在func函数中找name,首先 name='Alice',接着name='Jack',Jack替代了Allice,所以最终打印的name是Jack.当然,如果func函数中没有name,则会在func函数外也就是全局变量中找name.
反映出本例的作用域链就是:
全局----》func----》inner; 执行inner函数时,变量寻找顺序:inner----》func----》全局。
还有,要注意:函数执行过程中,值可以被替代。
第4条性质的例子如下:
function func(){ console.log(name); var name='Alice'; } func();
输出 undefined ,原因:在执行console.log(name)前,name已经被声明, var name; name='Alice' 是对name的重新赋值。
function func(){ console.log(name); } func();直接报错。name声明,但是没有值。