JS方法和闭包[重复]

问题描述 投票:0回答:1

JS 中对象的方法是否适用闭包?我是JS新手。在下面的代码中,我推断对象不会创建作用域,并且方法会记住它们的词法环境,即使它们被定义为对象的属性。

let name = "doe";
function foo() {
    let name = "jane";
    return {
        name: "jonh",
        sayName() {
            console.log(name);
        },
    };
}

foo().sayName(); // jane
javascript methods closures
1个回答
0
投票

在 JavaScript 中,闭包是一个基本概念,它允许函数即使在执行完毕后也能记住它们的词法范围。此行为不仅适用于独立函数,还适用于对象内定义的方法。在您的示例中,闭包的概念在确定 foo().sayName() 的输出中发挥着作用。

您在外部作用域中定义了一个值为“doe”的变量名。

您定义了一个函数 foo()。在该函数中,您可以定义一个值为“jane”的局部变量名称。然后,您返回一个 name 属性设置为“john”的对象和一个 sayName 方法,该方法从 foo 的外部范围引用 name 变量。

当您调用 foo() 时,它会返回一个带有 sayName 方法的对象。

调用 foo().sayName() 会在 sayName 方法的词法范围内记录 name 变量的值。由于 sayName 范围内没有本地名称变量,因此它查找范围链并找到在 foo 函数的外部范围中声明的名称变量,该变量的值为“jane”。这就是记录“jane”的原因。

因此,在您的示例中,闭包行为允许 sayName 方法“记住”定义 name 变量的词法环境中的值,即使它是在该环境之外调用的。

总而言之,闭包适用于 JavaScript 中的对象方法,就像它们适用于独立函数一样,并且它们允许方法即使在定义它们的作用域已完成执行之后,仍可以维护对其词法作用域中的变量的访问。

请告诉我这是否可以帮助您

© www.soinside.com 2019 - 2024. All rights reserved.