JS 函数做用域

var scope = 'global';函数

var f = function() {spa

     console.log(scope); // 输出 undefined ip

    var scope = 'f';作用域

}io

f();console

【解析】上面代码可能和你预想的不同,没有输出 global, 而是undefined,这是为何呢?这是 JavaScript 的一个特性,按照做用域搜索顺序,在 console.log 函数访问 scope 变
量时, JavaScript 会先搜索函数 f 的做用域,恰巧在 f 做用域里面搜索到 scope 变量,
因此上层做用域中定义的 scope 就被屏蔽了,但执行到 console.log 语句时, scope 还
没被定义,或者说初始化,因此获得的就是 undefined 值了。function

函数做用域的嵌套变量

有一点须要注意:函数做用域的嵌套关系是定义时决定的,而不是调用时决定的,也就
是说, JavaScript 的做用域是静态做用域,又叫词法做用域,这是由于做用域的嵌套关系可
以在语法分析时肯定,而没必要等到运行时肯定。搜索

var scope = 'top';
var f1 = function() {
    console.log(scope);
};
f1(); // 输出 top
var f2 = function() {
    var scope = 'f2';
    f1();
};
f2(); // 输出 top语法

【解析】这个例子中,经过 f2 调用的 f1 在查找 scope 定义时,找到的是父做用域中定义
的 scope 变量,而不是 f2 中定义的 scope 变量。这说明了做用域的嵌套关系不是在调用 时肯定的,而是在定义时肯定的。

相关文章
相关标签/搜索