JavaScript对象的作用域
一般来说,关于JSON的快速问题,假设我有:JavaScript对象的作用域,javascript,Javascript,一般来说,关于JSON的快速问题,假设我有: var foo = { a: null, init: function() { this.a = document.getElementById(...); } } 这将提供一个带有null的。除了通过foo.a=document.getElementById(…)从外部获取document元素之外,是否还需要跳出这个范围来获取document元素 编辑:更恰当地更改标题 我正在调用foo.init(),但当我这样做时,请说我有
var foo = {
a: null,
init: function() {
this.a = document.getElementById(...);
}
}
这将提供一个带有null的。除了通过foo.a=document.getElementById(…)从外部获取document元素之外,是否还需要跳出这个范围来获取document元素
编辑:更恰当地更改标题
我正在调用foo.init(),但当我这样做时,请说我有:
然后我调用init.foo(),它包含这个.a=document.getElementById('test'),它似乎返回NULL,可能是我做错了什么。这很好:
var foo = {
a: null,
init: function() {
this.a = document.getElementById('test');
}
}
foo.init();
console.log(foo.a);
这不是。JSON是一种轻量级数据交换格式,类似于JavaScript(因此命名为JavaScript对象表示法)。这只是普通的JavaScript
尽管如此,我不是100%确定你在问什么。在您的示例中,如果运行foo.init()
,那么foo.a
将被重新分配给document.getElementById(…)
。如果您想要获得全局对象,那么有一个老把戏:
var foo = {
a: null,
init: function () {
(function () {
this.test = 1;
})();
}
};
在该示例中,运行foo.init()
将创建值为1
的全局变量test
。如果您的意思是获取文档
元素,正如您所说,那么它与引用文档
一样简单(就像您所做的那样)。如果您的意思是在foo.init
中更改foo.a
的值,那么我只知道使用foo.a
和this.a
的两种方法
然而,我可能完全失去了目标 如何调用函数很重要。以下用法将按预期进行:
foo.init();
在上述示例中,init
内部的this
的值将是foo
,因此将修改foo.a
。但是,要小心。这:
var fn = foo.init;
fn();
…将不会按预期的方式运行。在这种情况下,接收要执行的消息的对象是window
对象,因此init
中this
的值将是window
,并且foo.a
不会被修改(window.a
将被修改)
您可以在函数中完全控制此
的值。换句话说,您可以控制函数执行的上下文。这是使用JavaScript的call/apply完成的:例如,如果我们这样做了会怎么样:
var someObj = {};
foo.init.apply(someObj);
在本例中,init
将在someObj
的上下文中执行,这意味着将修改someObj.a
进一步阅读: