JavaScript对象的作用域

JavaScript对象的作用域,javascript,Javascript,一般来说,关于JSON的快速问题,假设我有: var foo = { a: null, init: function() { this.a = document.getElementById(...); } } 这将提供一个带有null的。除了通过foo.a=document.getElementById(…)从外部获取document元素之外,是否还需要跳出这个范围来获取document元素 编辑:更恰当地更改标题 我正在调用foo.init(),但当我这样做时,请说我有

一般来说,关于JSON的快速问题,假设我有:

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

进一步阅读:


这不是JSON。对不起,我在这个问题中没有看到任何JSON。你能更清楚地描述一下你想做什么吗?@dan04是正确的,这是JSON,只要你删除N。我不完全确定问题是什么。是否要在不引用“a”的情况下执行函数?是否实际调用foo.init()?