解析一个简单的Javascript关闭

时间:2017-12-09 14:29:10

标签: javascript web ecmascript-6 closures

查看addSuffix函数的代码时

const addSuffix = (x) => {
    const concat = (y) => {
        return y + x
    }
return concat;
}

let add_ful = addSuffix("ful");

如果我是console.log(add_ful);为什么我得到

(y) => {
    return y + x
}

而不是

(y) => {
    return y + "ful"
}

对于我来说这是关于闭包的最令人困惑的一点,我明白我可以返回一个函数,但我不确定在函数中存储对“ful”的引用。

x的值存储在add_ful函数中的哪个位置?

2 个答案:

答案 0 :(得分:2)

该值未存储在代码中。在闭包中使用x的每个地方都没有内联 - 代码仍然包含一个变量x,当遇到它时它会被动态解析(它仍然是可写的)。

该值存储在包含变量的范围对象中,并由函数对象引用(我们称之为closure)。您还可以在记录函数对象时检查devtools中隐藏的[[Scope]]插槽(而不仅仅是.toString()生成的函数代码):

答案 1 :(得分:1)

console.log记录函数本身的字符串表示。它不会查询函数的状态并显示正在引用的当前值。它只显示了用于创建函数的语法。

但是,如果设置断点并完成执行,则可以使用调试工具查看范围内变量的状态。