1

该声明:

for( var item in this){
    console.log( item );
}

在全球范围内是一个 noop。然而在一个函数中

function foo(){
    for( var item in this){
        console.log( item );
    }
}
foo();

这会产生全局环境对象。这种行为的原因是什么?

如第一个示例所示,访问当前范围内的对象的语法是什么?

4

4 回答 4

2

在 JavaScript 中,“this”不是当前对象,而是当前方法的运行上下文。

例如 :

function foo(){ 
   console.log(this);
}

在全球范围内:

  • 如果我调用foo(),控制台日志是全局的
  • 如果我调用setTimeout(foo, 0),控制台会记录 Timer 对象,因为 foo 是由计时器调用的。

调用方法的最佳方式是在调用方法时使用 Function 对象的 call 方法绑定自己的运行上下文。

foo.call(this);

对不起,我的英语不好。^-^

于 2012-11-14T11:53:32.103 回答
1

看看MDN 对this关键字的介绍。

在全局范围内,this指的是全局对象。

在严格模式下(您似乎没有启用),一个简单的函数调用会导致一个undefinedthis 值。

对于非严格函数(比如你的foo),一个简单的调用会导致this再次成为全局对象。

于 2012-11-14T00:05:06.257 回答
1

this可能指向节点的导出对象。

所以在第一种情况下,this不指向window对象是正确的。在第二种情况下,thethis位于函数内部(它不是对象的方法),因此,正如您所料,它指向window.

于 2012-11-14T00:10:37.160 回答
1

ECMA-262 §10.4.1.1表明当进入全局执行上下文时,this设置为全局对象。所以如果第一个代码示例是在全局上下文中执行的,this应该引用全局对象。

我没有node.js,但如果那是主机环境,您应该node.js在问题中添加一个标签以吸引了解node.js.

在第二个例子中,函数this不是由调用设置的,所以它默认为全局对象。在严格模式下,它将是未定义的,尝试访问this将引发错误。

于 2012-11-14T00:15:01.317 回答