我有以下代码:
function bird(type) {
return function (whattosay) { //return the whole function
console.log (type + ' ' + whattosay)
}
}
var birdRef = bird('blackbird');
birdRef('singing in the dead of night');
var secondRef = bird('whitebird');
birdRef('singing after that night');
我正在尝试熟悉两个概念,闭包和作用域链。 好吧,在我的第一个 birdRef 中,我返回了一个新的函数对象,然后我在该行之后调用它。最后我在控制台看到“黑鸟在夜深人静时唱歌”。我知道为了找到 bird 类型的 var,闭包给你一个父类的引用,它在作用域链中寻找那个 var 并最终找到它,所以我们看到了 bird 的类型。
那么你有这个:
var secondRef = bird('whitebird');
传递了一个新参数,所以现在 bird 函数中的 var“type”从 blackbird 更改为 whitebird。
现在我回到我之前创建的函数 birdRef,我不明白的是,接下来会发生什么:
birdRef('singing after that night');
我收到“黑鸟在那天晚上唱歌”,而不是白鸟。好吧,如果我没记错的话,birdRef 函数是不是来到它的父函数 bird,并读取更新后的 bird 变量的类型(我的意思是他在本地环境中找不到那个 var,所以他查看外部环境并找到 var "type")?
对不起,如果我对这方面很陌生,我没有多大意义,谢谢你的时间。
最佳答案
第二次实际上调用的是第一个闭包的结果。
下面一行:
birdRef('singing after that night');
应该是:
secondRef('singing after that night');
我在下面包含了一个工作演示。
function bird(type) {
return function (whattosay) { //return the whole function
console.log (type + ' ' + whattosay)
}
}
var birdRef = bird('blackbird');
birdRef('singing in the dead of night');
var secondRef = bird('whitebird');
secondRef('singing after that night');
// ^^ secondRef instead of birdRef
// Test is again.
birdRef('singing in the dead of night');
secondRef('singing after that night');
因为 type
是在函数调用的词法范围内定义的,所以在该词法范围之外是不可访问的。如上所示,除非变量在其定义的词法范围内被修改,否则无法访问或修改它。
关于Javascript - 无法理解闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33421822/