使用对象范围的变量将函数和变量封装在对象中

时间:2014-04-28 12:16:07

标签: javascript

所以,我想创建一个可以包含函数和变量的对象以及包含函数和变量的对象,但我发现如果有"顶级"变量,由于范围规则,它们不能被更深层的函数访问。例如:

var myobj = {
    foo: "test",

    bar: function() {
        return this.foo;
    },

    baz: {
        piz: "test2",
        poz: function() {
            return this.piz + this.foo;
        }
    }
}

console.log(myobj.bar());
console.log(myobj.baz.poz());

第二个回叫" test2undefined"出于显而易见的原因 - this.foo引用了baz.foo(未定义)而不是myobj。如何引用myobj以允许变量foo在此对象的任何位置都可用?

4 个答案:

答案 0 :(得分:1)

您可以将poz()修改为:

poz: function() {
  return this.piz + myobj.foo;
}

this无法引用两个对象。所以我只是使用myobj.foo

我想,当您在该特定行使用此内容时,您想引用myobj,那么为什么不使用该对象的属性呢?

请注意,您始终可以通过代码中的原始对象名称​​ where 引用任何属性来引用任何属性。

答案 1 :(得分:1)

您可以将baz更改为功能并记住当前上下文

var myobj = {
    foo: "test",

    bar: function() {
        return this.foo;
    },

    baz:function() {
      var me = this;   

     return {    
        piz: "test2",
        poz: function() {
            return this.piz + me.foo;
        }
     }
    }
}

console.log(myobj.baz().poz());

答案 2 :(得分:0)

您的错误是正常的。在poz函数中,this引用baz对象。不是myobj。

要更改poz功能,您可以像这样在函数上传递上下文:

var myobj = {
    foo: "test",

    bar: function() {
        return this.foo;
    },

    baz: {
        piz: "test2",
        poz: function(ctx) {
            return this.piz + ctx.foo;
        }
    }
}

console.log(myobj.baz.poz(myobj));

这不是很好的解决方案,但在这种情况下,它就是宽松的。

答案 3 :(得分:0)

基本上,如果要访问对象内的某些属性,则应使用 var 关键字来声明它。

我已经修改了一些你的例子:

function MyObj() {
    var foo =  "test";

    this.bar = function() {
        return foo;
    };

    this.baz = {
        piz: "test2",
        poz: function() {
            return this.piz + foo;
        }
    }
}

myobj = new MyObj();

console.log(myobj.bar());
console.log(myobj.baz.poz());