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

时间:2012-04-15 00:57:14

标签: javascript

我想知道如何使用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);

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

3 个答案:

答案 0 :(得分:5)

问题在于,在您的函数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中this关键字的行为很有趣。我推荐Mozilla开发者网络上的优秀writeup

答案 1 :(得分:1)

你可以这样做:

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

不确定这是否是最佳解决方案,但它确实有效。如果您在函数内部,则Javascript this 始终引用内部范围。

答案 2 :(得分:1)

只需删除this

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

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

LIVE DEMO