本以为理解了js作用域,但是在网上看了一篇文章之后又发现以前对js作用域的理解有一点不全面,遂写了这篇文章。
参考:JavaScript Scoping and Hoisting
首先你应该了解js是没有块级作用域的!
接着看下面一段代码,alert值应该是什么?
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
如果说这段代码的执行结果是10,你会不会有疑问?
在js中没有块级作用域,但是有函数作用域的,上面代码中的bar方法中的foo变量被提升了,可以这样理解:
var foo=1;
function bar() {
//javascript没有块级作用域, 在一个函数内任何地方声明的var都会被提到函数的最开头
//相当于这里有一个 var foo;
alert(foo); //undefined, 因为函数内的var foo把外头的给覆盖了
if (!foo) {
var foo = 10; //相当于foo = 10; var foo的声明被提到最前
}
alert(foo);
}
bar();
你懂了吗