Javascript - 无法理解闭包

标签 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('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/

相关文章:

java - spring中@Configuration类的作用域

javascript - 如何使 CoffeeScript 闭包感知非局部变量?

javascript - 闭包如何在作为参数传递的函数表达式中工作?

Javascript 函数仅在取消注释 alert() 时有效

javascript - 在没有源代码或构建过程的 Electron 应用程序的生产构建中打开 Chromium DevTools

javascript - 用于下拉菜单的 JQuery Mobile CSS

ruby - 是否有等效于自定义 'class variables' 的哈希值? ( ruby )

javascript - 当模态类处于事件状态时,Google map 会消失

javascript - 变量范围: name being passed between functions?

objective-c - 类型转换封闭/ block