JavaScript对象的范围

时间:2011-02-19 22:31:14

标签: javascript

关于JSON的快速提问,我说:

var foo = {
  a: null,
  init: function() {
    this.a = document.getElementById(...);
  }
}

这将给出一个null。无论如何,除了通过foo.a = document.getElementById(...)在外部进行文档元素之外,是否可以超出此范围并获取文档元素?

编辑:更恰当地更改了标题。

我正在调用foo.init(),但是当我这样做时,请说我有:

然后我调用包含this.a = document.getElementById('test')的init.foo()它似乎返回NULL,也许我做错了。

3 个答案:

答案 0 :(得分:2)

这很好用:

var foo = {
  a: null,
  init: function() {
    this.a = document.getElementById('test');
  }
}

foo.init();
console.log(foo.a);

http://jsfiddle.net/dwhxN/

答案 1 :(得分:1)

这不是JSON。 JSON是一种轻量级数据交换格式,类似于JavaScript(因此名称为 JavaScript Object Notation )。这只是常规的JavaScript。

尽管如此,我并不是100%肯定你在问什么。在您的示例中,如果您运行了foo.init(),那么foo.a将被重新分配给document.getElementById(...)。如果你想获得全局对象,那就有这个老技巧:

var foo = {
    a: null,
    init: function () {
        (function () {
            this.test = 1;
        })();
    }
};

在该示例中,运行foo.init()将创建值为test全局变量1。如果你的意思是获得document元素,就像你说的那样,它就像引用document一样简单(正如你所做的那样)。如果您的意思是在foo.a内更改foo.init的值,那么我只知道使用foo.athis.a的两种方法。

然而,我可能完全错过了这个标记......

答案 2 :(得分:1)

重要的是如何调用函数。以下用法将按预期运行:

foo.init();

在上面的示例中,this中的init值为foo,因此foo.a将被修改。但是要小心。这样:

var fn = foo.init;
fn();

...不会按预期行事。在这种情况下,接收要执行foo的消息的对象是window对象,因此thisinit的值为window,{{{ 1}}不会被修改(foo.a将会是。)

您可以完全控制功能中window.a的值。换句话说,您可以控制执行函数的上下文。这是使用JavaScript的call / apply完成的:例如,如果我们这样做了:

this

在此示例中,var someObj = {}; foo.init.apply(someObj); 将在init的上下文中执行,这意味着someObj将被修改。

进一步阅读: