gpt4 book ai didi

javascript - 回调定义关闭问题

转载 作者:行者123 更新时间:2023-11-28 12:16:07 25 4
gpt4 key购买 nike

对于定义回调的位置的范围界定,我遇到了一些困惑。

function test(){

var b = 3
var fun = function(){

var printingFunction = function(){
console.log(b)
}
printingFunction()
}

return fun
}

test()() //prints 3, as expected because of closures
<小时/>

但是,以下内容不起作用

function test(){

var b = 3
var fun = function(cb){
cb()
}

return fun
}

test()(function(){console.log(b)}) //b is not defined

我希望由于该函数作为参数传递并且之前尚未定义,因此它的定义发生在“fun”内部,因此它可以访问b。相反,它看起来很像函数首先在其传递的作用域中定义,然后作为参数传递。有什么想法/指示吗?

<小时/>

编辑:一些额外的指针。

someFunction("a")

我们不可能声称“a”是一个定义。这里隐含地发生的是“a”被分配给由参数名称命名的变量,因此var argumentNameInDefintion =“a”。这发生在 someFunction 的主体中。

同样,我们不能声称 {}someFunction({}) 中的定义。那么为什么会:

someFunction(function(){})

确定 function(){} 是一个定义超出了我的范围。如果是的话

var a = function(){}
someFunction(a)

一切都会变得非常有意义。也许这就是语言的工作原理。

最佳答案

JavaScript 中的作用域是词汇的。如果您查看示例,您可以看到 printingFunction 的定义位置,按词法(例如,在源文本中)b 是在包含范围中声明的。但在你的第二个例子中,事实并非如此。这就是为什么 b 在第二个示例中无法解析,但在第一个示例中可以解析。

它的工作方式是,当创建一个函数时,它会引用一个概念对象,该对象包含其创建范围内的变量等(它有一个奇特的名称:“词法环境对象”);并且该对象具有对包含该对象的对象的引用。当查找变量引用时,JavaScript 引擎会查看当前的词法环境对象,如果找到该变量,则使用它;否则,它会查找链中的前一个,依此类推直至全局。

更多详细信息请参见:

关于javascript - 回调定义关闭问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49106298/

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