Javascript-can';我不懂闭包

Javascript-can';我不懂闭包,javascript,scope,closures,chain,Javascript,Scope,Closures,Chain,我有以下代码: 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('white

我有以下代码:

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“type”)


抱歉,如果我不太明白,因为我是新来的,谢谢您抽出时间。

您第二次实际调用第一次关闭的结果

以下一行:

birdRef('singing after that night');
应该是:

secondRef('singing after that night');
我在下面包括了一个工作演示

功能鸟(类型){
返回函数(whattosay){//返回整个函数
console.log(类型+“”+whattosay)
}
}
var birdRef=鸟(“黑鸟”);
birdRef(“夜深人静时唱歌”);
var secondRef=鸟(“白鸟”);
secondRef(“那晚之后唱歌”);
//^secondRef而不是birdRef
//考试又开始了。
birdRef(“夜深人静时唱歌”);

secondRef(“那晚之后唱歌”)否,每个函数调用都会创建一个新的上下文(环境),其中包含一个不同的
类型
变量
birdRef
secondRef
是两个不同的函数对象,它们在两个不同的变量上闭合。因此,每个bird函数调用都会创建一个适合调用方的新bird函数?正确,每个
bird()
返回一个新函数(具有相同的代码但不同的上下文)你能告诉我这或多或少会发生什么吗?这个链接是404,所以我不能告诉任何事情,我故意第二次把birdRef放在这里是为了看看鸟的类型是否因为前一行代码secondRef而改变。这是为了看看它是否会影响birdRef函数,因为birdRef会进入作用域链并试图找到最近被secondRef更改的“type”var。不,它不会进入作用域链,因为type是在由分配给bird关键字的外部函数声明创建的词法范围内声明的。因为每次调用bird时,它都会创建一个新的词法作用域,然后在其中创建返回的函数。基本上,当您将关键字添加到函数的参数列表中时,该关键字将使用函数调用中传递的值标识在以下范围内可访问的变量。这与在函数范围内使用var关键字定义变量并为其分配静态值是一样的。从中我唯一能理解的是,每次调用都会创建一个新的bird函数,并且计算机不会过度写入,并且可以引用它们在内存中的点。我认为作用域链=词法环境…与其说创建了一个新的bird函数,不如说每次调用bird时,它都会创建一个新的词法作用域,在其中“构建”一个新函数并返回该函数。返回的函数引用正在声明它的词法作用域中操作。用更人性化的话来说,函数的意思是“每次使用此关键字时,根据提供的参数执行这组任务”。