开胃小菜:
function outer() {
var x = 10;
function inner() {
console.log(x);
}
x = 20;
return inner;
}
var innerFunc = outer();
innerFunc();
答案是多少?
function printNumbers() {
for (let i = 1; i <= 5; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
}
printNumbers();
答案是多少?
小菜的解析:
解析开胃小菜:
这段代码定义了一个外部函数outer()
,它内部包含一个局部变量x
被赋值为10,并声明了内部函数inner()
。然后,outer()
函数修改了变量x
的值为20,并返回了内部函数inner
的引用。接着,在主代码中,将
outer()
函数的返回值赋给变量innerFunc
。然后,调用innerFunc()
,它实际上是调用了内部函数inner()
。在内部函数中,它尝试打印变量x
的值。由于JavaScript的作用域链(scope chain)机制,内部函数
inner()
可以访问并打印在其外部函数outer()
中声明的变量x
。当调用innerFunc()
时,它会输出变量x
的当前值,也就是20。因此,最终的输出结果是20。
第二道题的解析:
在这段代码中,
printNumbers
函数使用setTimeout
延迟输出数字,并以特定的时间间隔递增。在第一次迭代时,
setTimeout
的延迟时间是1秒,所以在1秒后,函数会执行并输出数字1。
在第二次迭代时,setTimeout
的延迟时间是2秒,所以在2秒后,函数会执行并输出数字2。
以此类推,每次迭代的延迟时间递增,分别为3秒、4秒和5秒,最后分别输出数字3、4和5。因此,最终的输出结果是 1、2、3、4、5。