【发布时间】:2016-01-30 01:01:40
【问题描述】:
我有以下代码:
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 中,我返回一个新的函数对象,然后在该行之后调用它。最后,我在控制台中看到“黑鸟在深夜唱歌”。我知道为了找到鸟类型 var,闭包给你一个对父级的引用,它有点在作用域链中寻找那个 var 并最终找到它,所以我们看到了鸟的类型。
那么你有这个:
var secondRef = bird('whitebird');
已经传递了一个新参数,所以现在 Bird 函数中的 var "type" 从 blackbird 更改为 whitebird。
现在我回到我之前创建的函数birdRef,我不明白的是,接下来会发生什么:
birdRef('singing after that night');
我得到“那晚之后黑鸟在唱歌”,而不是白鸟。好吧,如果我没记错的话,birdRef函数不是到它的父函数bird,并读取更新的bird变量的类型(我的意思是他在本地环境中找不到那个var,所以他查看外部环境,发现 var "type")?
对不起,如果我不了解,因为我是新手,感谢您抽出宝贵时间。
【问题讨论】:
-
不,每个函数调用都会创建一个带有不同
type变量的新上下文(环境)。birdRef和secondRef是两个不同的函数对象,它们关闭了两个不同的变量。 -
就好像,每次鸟函数调用都会创建一个适合调用者的新鸟函数?
-
正确,每个
bird()返回一个新函数(代码相同但上下文不同) -
你能告诉我这或多或少会发生什么吗? pasteboard.co/1Kh7a4MM.jpg
-
那个链接是404,所以我什么都说不出来
标签: javascript scope closures chain