【发布时间】:2018-03-05 08:35:07
【问题描述】:
关于定义回调的位置,我遇到了一些关于范围界定的困惑。
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 closures