面试题答案
一键面试- 输出结果:
- 输出结果为
10
。
- 输出结果为
- 函数提升:
- 在JavaScript中,函数声明会被提升到其所在作用域的顶部。在上述代码中,
function x() { return 'I am a function'; }
是一个函数声明,它会被提升到全局作用域的顶部。但是,这并不会影响closure
函数内部对x
的查找。因为closure
函数形成的闭包作用域链中,首先查找自己内部作用域(这里inner
函数没有自己的x
变量声明),然后查找其外部函数outer
的作用域,找到了let x = 10;
声明的x
变量。而全局作用域中的x
函数声明,在closure
函数的作用域链查找过程中,不会被找到,因为closure
函数的作用域链在找到outer
函数作用域中的x
变量后就停止查找了。
- 在JavaScript中,函数声明会被提升到其所在作用域的顶部。在上述代码中,
- 作用域链:
- 当
closure
函数被调用时,JavaScript引擎会沿着作用域链查找变量x
。作用域链是由函数的词法作用域决定的。closure
函数(即inner
函数)的作用域链首先包含它自己的作用域(这里为空,因为inner
函数没有声明任何局部变量),然后包含outer
函数的作用域(在这里找到了let x = 10;
声明的x
变量),再往上是全局作用域。所以在closure()
调用时,会找到outer
函数作用域中的x
变量并输出其值10
。
- 当
- 闭包:
- 闭包是指函数能够记住并访问其词法作用域,即使函数在其词法作用域之外被调用。在上述代码中,
inner
函数(赋值给closure
)形成了闭包。inner
函数在outer
函数外部被调用(closure()
),但它仍然能够访问outer
函数作用域中的变量x
。这是因为当outer
函数返回inner
函数时,inner
函数的作用域链中保留了对outer
函数作用域的引用,使得inner
函数在outer
函数执行完毕后,依然可以访问outer
函数作用域中的变量x
。
- 闭包是指函数能够记住并访问其词法作用域,即使函数在其词法作用域之外被调用。在上述代码中,