Javascript变量范围。如何从内部对象函数访问对象变量?

Javascript变量范围。如何从内部对象函数访问对象变量?,javascript,Javascript,我想知道如何使用javascript对象中的函数访问“nam”e变量,如下所示: function myObj() { this.vars = { name: 'bob', age: '42' } this.functions = { sayName: function() { alert(this.vars.name); } } } var obj = new myObj(

我想知道如何使用javascript对象中的函数访问“nam”e变量,如下所示:

function myObj() {
    this.vars = {
        name: 'bob',
        age: '42'
    }
    this.functions = {
        sayName: function() {
            alert(this.vars.name);
        }
    }
}

var obj = new myObj();
obj.functions.sayName();
我错过了什么

如果我传递一个对自身的引用,我可以得到名称var,如下所示:

function myObj() {
    this.vars = {
        name: 'bob',
        age: '42'
    }
    this.functions = {
        sayName: function(name) {
            alert(name);
        }
    }
}

var obj = new myObj();
obj.functions.sayName(obj.vars.name);

但这似乎有点多余。。。想法?

你可以这样做:

var thisObj = this;
this.functions = {
    sayName: function() {
        alert(thisObj.vars.name);
    }
}

不确定这是否是最好的解决方案,但它是有效的。如果在函数中,Javascript this总是指内部作用域。

只需删除
this

function myObj() {
    var vars = {
        name: 'bob',
        age: '42'
    };
    this.functions = {
        sayName: function() {
            alert(vars.name);
        }
    };
};

var obj = new myObj();
obj.functions.sayName();​

问题在于,在函数
this.functions.sayName
中,
this
关键字指的是
this.functions
,而不是当前对象1

以下是该问题的修复方法:

function myObj() {
    var vars = this.vars = {
        name: 'bob',
        age: '42'
    }
    this.functions = {
        sayName: function() {
            alert(vars.name);
        }
    }
}

var obj = new myObj();
obj.functions.sayName();
这将在
myObj
内部创建一个局部变量,您可以从任何内部作用域访问该变量。它还将该变量作为任何实例化的
myObj
类的属性公开给外部世界,这意味着您仍然可以执行以下操作

obj.vars.name = 'test';
它仍然会改变对象的内部状态。这可能是当前设置的最佳解决方案


1 JavaScript中
这个
关键字的行为很有趣。我推荐Mozilla开发者网络上的优秀开发者。

它创建一个隐式全局对象,并将
vars
对象与任何特定对象解耦。如果您实例化了另一个
myObj
,那么最终会有多个对象共享状态。@Reid。我犯了一个小错误,看看最新的提琴。真棒的答案。我确实需要保持外部组件可以访问变量,因此添加this.vars=是关键。谢谢