这在全球范围内

时间:2012-11-13 23:51:08

标签: javascript node.js

声明:

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

在全球范围内是否是noop。但是在一个函数中

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

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

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

4 个答案:

答案 0 :(得分:2)

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

例如:

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

在全球范围内:

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

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

foo.call(this);

抱歉我的英语不好。 ^ - ^

答案 1 :(得分:1)

查看MDN's introduction to the this keyword

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

ECMA-262 §10.4.1.1表明在输入全局执行上下文时,this被设置为全局对象。因此,如果第一个代码示例在全局上下文中执行,this应该引用全局对象。

我没有node.js,但如果这是主机环境,您应该在问题中添加node.js标记,以吸引了解node.js的人。

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

相关问题