先看作用域的定义:
js的函数作用域是词法作用域,也就是函数内部的变量在函数声明的时候就确定下来。
先来看一个例子
例1:
var str = "global";
function scopeTest()
{
alert(str);//声明时,函数内部无变量放入函数的作用域链中
}
scopeTest();//函数执行时,由于函数内部无str变量,所以直接访问函数外部的全局变量 结果是:"global"
此时可能你感觉都在意料之中,请看第二个例子
var str = "global";
function scopeTest2()
{
alert(str);
var str = "inner";
alert(str);
}
scopeTest2();
结果是什么呢?
"global"
"inner"
恭喜你,掉坑里了!
正确结果是:
undifined
"inner"
为什么呢?原因在于词法作用域,当scopeTest2()函数声明时,将函数内部的var变量str放入函数的作用域链中;
当访问函数时候,先执行alert(str);这一句,由于函数作用域链中有str变量,函数不会访问全局变量str;重要的是
此时的内部str并未定义,所以提示undifined.
个人理解就是:如果函数内部的变量与外部变量重名,函数作用域会令函数强制访问内部变量。
--如有异议,欢迎指出!