gpt4 book ai didi

javascript - 定义为参数的函数的闭包

转载 作者:行者123 更新时间:2023-11-30 14:44:53 27 4
gpt4 key购买 nike

免责声明:这个问题纯粹是出于好奇,并且与 javascript 的工作原理有很大关系。

我明白为什么下面的代码有效。由于闭包,foo 可以访问 a 所在的范围。这是有道理的。

var a = 10

var foo = function(){
console.log(a);
}

setTimeout(foo,1000)

但是,我想知道为什么以下内容也有效(稍后解释)。

var a = 10
setTimeout(function(){
console.log(a);
},1000)

该函数在接收它的函数的参数中定义,并且本质上从来不是包含 a 的范围的闭包。我们知道,当一个函数接收到一个参数时,它会为该参数创建一个局部变量,例如

var outerVar="5"

var bar = function(a){
//implicitly, var a = outerVar happens here
console.log(a)
}

bar(something);

因此按照该逻辑,传递给 setTimeout 的函数无法访问 a 但它确实可以访问。

我怀疑当一个函数在参数空间中定义时会发生什么,它实际上是在被分配为参数之前定义的,但没有证据证明这一点。非常感谢任何指点。

非常感谢。

最佳答案

这不完全是闭包,但已经很接近了。

严格来说,闭包是指变量的范围结束,但仍包含在仍然存在的内部函数中:

function createTimer() {
let counter = 0;
return function() {
return counter++;
}
}

const timer = createTimer(); // function() { ... }
console.log(timer(), timer(), timer()); // 0, 1, 2

定义了counter的函数已经返回,作用域结束,正常情况下,counter应该已经死亡并被垃圾回收了。但是从 createTimer() 返回的内部函数仍然有对它的引用,来自封闭范围,这是一个闭包。


在 JavaScript 中,每个函数都可以访问其所有祖先的所有作用域,这就是您在这里看到的。

传递给 setTimeout() 的函数可以访问 a,因为 a 是在它周围的范围内定义的。

关于javascript - 定义为参数的函数的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com