【问题标题】:Scope chains in object literals [duplicate]对象文字中的范围链 [重复]
【发布时间】:2013-06-18 22:09:15
【问题描述】:
var x = 9;
var mod = {
    x: 81,
    assign: function(){
        this.x = 9;
        x = 3;
    },
    checkVars: function(){
        alert(x + " - " + this.x );
    }
};

mod.checkVars(); //9 - 81

mod.assign();
mod.checkVars(); //3 - 9

alert(x); //3

请解释作用域链是如何在这里设置的。为什么xcheckVarsassign 中的范围解析会跳过对象mod

【问题讨论】:

  • mod 没有名为 x 的变量。它有一个名为x属性
  • 我从未说过x 是一个变量。 checkVars 只是一个花哨的名字,如果你是认真的。
  • 您似乎缺少的是范围链仅适用于变量,而不适用于属性(原型链适用于那些)。
  • @bfavaretto 你是对的。你的提示很好。

标签: javascript oop object scope-chain


【解决方案1】:

我在您的程序中添加了一些 cmets:

var x = 9; // This is the *only* variable called x in your program
var mod = {
    x: 81, // this x refers to a property of mod also called x
    assign: function(){
        this.x = 9; // "this" refers to the object mod, this.x is the x property of mod
        x = 3; // x here refers to your variable called x
    },
    checkVars: function(){
        alert(x + " - " + this.x ); // same as above
    }
};

mod.checkVars(); //9 - 81

mod.assign();
mod.checkVars(); //3 - 9

alert(x); //3

换句话说,您的困惑与范围解析没有任何关系。每当您引用x 时,您指的是您在程序顶部定义的唯一一个名为x 的变量。每当您引用 this.x 时,您指的是您在 mod 对象字面量上定义的名为 x 的属性。

希望这有助于澄清事情!

【讨论】:

  • this x refers to your variable called x 也许你应该把它改成:x here refers to your variable called x - 只是为了消除对“this x”和this.x的任何误解
  • @NULL - 嘿,是的,这可能不那么令人困惑。
  • 实际上正在进行一些范围解析。函数内部没有本地x,在作用域链的父级找到x
  • @bfavaretto - 嗯,我想人们会明白我的意思。但我改变了措辞。
  • 是的,有时我太挑剔了,甚至都没有注意到它......对不起。
【解决方案2】:

变量和对象属性不是一回事。变量是作用域链的一部分,属性不是。 assigncheckVars 范围内的唯一变量是 xmodmod 的属性只能通过this.propName(或mod.propName)在这些方法中可见。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 2018-06-07
    • 2012-06-11
    • 1970-01-01
    • 2013-06-05
    • 2017-08-11
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多