JavaScript中调用f1为何输出1而非100?闭包作用域问题咨询
JavaScript作用域规则解答
你遇到的输出问题本质是由JavaScript的词法作用域规则决定的,和闭包特性没有直接关联,核心原因如下:
- JavaScript采用词法作用域(静态作用域),函数的作用域链在函数定义阶段就已经确定,仅和函数定义时的所在位置有关,和函数的调用位置、调用上下文完全无关。
- 你定义的
f1是在全局作用域下声明的,它的作用域链是f1自身作用域 → 全局作用域。当f1执行时内部找不到变量x,就会向上查找全局作用域下的x,值固定为1,不管在哪里调用f1都会是这个结果。 - 你理解的「调用时优先查找所在执行上下文的变量」是动态作用域的规则,JavaScript并不采用该规则,所以
f1不会读取f2内部声明的x变量。
如果你希望调用时可以读取到f2内部的x,可以将f1定义在f2内部,此时f1的外层作用域绑定为f2的作用域,就可以得到你预期的结果:
var x = 1; function f2(){ var x = 100; // f1定义在f2内部,作用域外层指向f2 function f1(){ console.log(x); } f1(); } f2() // 输出100
内容的提问来源于stack exchange,提问作者Probhakar Sarkar
相关产品推荐
相关产品推荐

