关于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,也许我做错了。
答案 0 :(得分:2)
这很好用:
var foo = {
a: null,
init: function() {
this.a = document.getElementById('test');
}
}
foo.init();
console.log(foo.a);
答案 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.a
和this.a
的两种方法。
然而,我可能完全错过了这个标记......
答案 2 :(得分:1)
重要的是如何调用函数。以下用法将按预期运行:
foo.init();
在上面的示例中,this
中的init
值为foo
,因此foo.a
将被修改。但是要小心。这样:
var fn = foo.init;
fn();
...不会按预期行事。在这种情况下,接收要执行foo
的消息的对象是window
对象,因此this
内init
的值为window
,{{{ 1}}不会被修改(foo.a
将会是。)
您可以完全控制功能中window.a
的值。换句话说,您可以控制执行函数的上下文。这是使用JavaScript的call / apply完成的:例如,如果我们这样做了:
this
在此示例中,var someObj = {};
foo.init.apply(someObj);
将在init
的上下文中执行,这意味着someObj
将被修改。
进一步阅读: