javascript没有块级作用域

犀牛书上是这么说的:javascript没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中他们都是有定义的。

这有点不容易理解。

看下面两个例子。

var scope = “global”;

function f(){
alert(scope);
}

f();

很正常的如你所想的,程序运行后会弹出”global”;因为这里scope是一个全局变量。


那么再看下面这段代码:

var scope = “global”;

function f(){
alert(scope);
var scope = “local”;
alert(scope);
}

f();

程序运行后又是什么情况呢?你认为第一个弹出的会是什么呢?

是”undefined”,而不是global。因为开头就说了,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都有定义。在第二个例子中,函数f中的scope被声明,则在整个f中都具有定义,因此第一个alert中的scope是属于在f中有声明但未被赋值的变量,因此会undefined。

而第一个例子中,函数f中并未有定义scope变量,因而函数f会在其上下文中寻找scope的定义,所以会弹出global。

这样告诉我们,javascript中的变量和函数是从本作用域优先于上级作用域的。

发表评论

返回顶部