MST
星途 面试题库

面试题:JavaScript作用域链与闭包在变量提升中的应用

有如下代码: ```javascript function outer() { var x = 1; function inner() { console.log(x); } return inner; } var closure = outer(); closure(); // 如果在调用closure() 之前添加 x = 2; 这行代码,输出结果会有什么变化,为什么? ```
37.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 添加x = 2; 前的输出分析
    • 这里涉及到闭包的概念。outer函数返回inner函数,inner函数能够访问其外部函数outer中的变量x
    • var closure = outer();执行时,outer函数执行,x被赋值为1,然后返回inner函数并赋值给closure
    • closure();执行时,inner函数查找并输出x的值,此时x的值为1,所以输出1
  2. 添加x = 2;后的输出分析
    • 如果在调用closure();之前添加x = 2;这行代码。
    • 由于没有声明x,这里的x会被当作全局变量处理(在非严格模式下)。
    • inner函数访问的x是其词法作用域中的x,也就是outer函数中的x,而不是全局变量x
    • 所以添加x = 2;后,调用closure();输出依然是1,因为inner函数访问的是闭包中outer函数内定义的x,不受全局变量x的影响。

总结:在调用closure();之前添加x = 2;,输出结果不变,依然为1,原因是闭包中的inner函数访问的是其词法作用域(outer函数内部)的x,而非全局变量x