gpt4 book ai didi

javascript - 这些是否被认为是 Javascript 闭包?

转载 作者:数据小太阳 更新时间:2023-10-29 05:23:36 31 4
gpt4 key购买 nike

想在这里弄清楚...所以我有 2 个问题

下面的函数创建了一个闭包。

function Foo(message){
var msg = message;

return function Bar(){
this.talk = function(){alert(msg); }
}
};

问:闭包是Foo还是Bar
我一直认为闭包是 Foo,因为一旦 Bar 返回,它就会关闭 Bar

下一步...

下面是一个匿名函数的定义:

()();

问:这个匿名函数里面的inner-function也是闭包吗?

(function(){ /* <-- Is this function also a closure? */ })();

最佳答案

你需要在这里使用第一原则。 Javascript 使用词法作用域。这意味着执行上下文的范围由代码的定义(词法)方式决定。

我会说 Bar 函数的定义导致创建闭包的原因,因为msg 在函数中是“封闭的”。

闭包的实际创建发生在运行时(这有点像重言式的语句,因为在计算机程序运行之前什么都不会发生),因为为了确定 msg 的值,在Bar中,当Bar执行时,解释器需要知道Foo执行时变量的值,以此类推链。

我将对您的问题给出两个答案。迂腐的答案是:函数本身都不是闭包。它是函数内变量的定义,结合函数运行时的执行上下文,即定义了闭包。常见的答案是:任何关闭变量的函数都是闭包(在你的例子中是 Bar )。

想一想每个人在使用 Javascript 时都会遇到的问题。

function A(x) {
var y = x, fs = [];

for (var i = 0; i < 3; i++) {
fs.push(function(){
console.log (i + " " + x);
})
}

fs.forEach(function(g){g()})
}

A('hi')

大多数人会说这会产生输出“hi 1”,然后是“hi 2”,然后是“hi 3”。但是,它会产生 3 次“hi 3”。如果只是将函数的定义添加到数组中,同时使用在外部函数中定义的变量,创建了闭包,这怎么可能?

这是因为您需要执行上下文 来定义闭包,直到运行时才会发生。在执行数组中的函数时,i 的值为 3。在 forEach 语句中,这是执行上下文,这就是输出始终使用 3 的原因。

关于javascript - 这些是否被认为是 Javascript 闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12039502/

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