这个'这个'函数中的关键字

时间:2013-03-19 18:04:11

标签: javascript function object this

取自ejohn.org:

function katana(){ 
  this.isSharp = true; 
} 
katana(); 
assert( isSharp === true, "A global object now exists with that name and value." ); 

这是真实的。

有人可以解释一下吗? 在我们看到this.isSharp = true的函数内部,不会创建一个object,它应该具有属性isSharp,其值为true? (我认为该对象是武士刀,因为它调用了函数,因此katana.isSharp将是true)。 换句话说,this到底指的是什么?

如何将isSharp创建为对象?

4 个答案:

答案 0 :(得分:3)

this在JavaScript中真的很不可思议。

this是根据函数调用的上下文确定的,而不是函数的属性。如果像这样调用函数:

f()

然后this将引用全局对象。如您所见,向全局对象添加属性等效于添加全局变量。如果像这样调用函数:

foo.f()

然后this将引用foo。例如:

> function printx() { console.log(this.x); }
> x = 300
> obj1 = {x: 20, printx: printx};
> obj2 = {x: 50, printx: printx};
> printx();
300
> obj1.printx();
20
> obj2.printx();
50

最后,如果像这样调用一个函数:

new f()

然后创建一个新对象,this引用该新对象,并且表达式new f()计算该新对象或f()返回的对象{{1}返回一个对象。

一切都在规范中。非常奇怪。

答案 1 :(得分:2)

您不使用new,因此this是函数中的全局对象(window)。

katana();

真的是

window.katana(); // the passed context is window

这就是为什么断言isSharp===true(实际上测试window.isSharp)会返回true

如果您要创建katana的新实例,请使用new katana(),然后this将成为该函数内的新实例,保持window.isSharp不受影响。< / p>

答案 2 :(得分:2)

  

是不是会创建一个应该具有属性isSharp的对象,它的值是否为真?

不,因为该函数未作为构造函数调用。如果您有var obj = new katana(),那么您将获得一个具有isSharp属性的对象。否则,它只是一个函数调用,那么this应该是什么? JavaScript不知道,所以它决定它是未定义的并且回退到全局对象(除非在严格模式下)。

确定JavaScript中函数内部this的值可能会令人困惑,因为它是动态确定的,具体取决于函数的调用方式。基本规则是this将是全局对象,除非:

  • 该函数被称为对象方法(然后这将是对象),或
  • 使用new运算符将函数作为构造函数调用(在这种情况下,这将指向正在构造的新对象)

有关MDN

的更多详情

答案 3 :(得分:0)

this指的是调用的对象上下文。

在你的情况下是window.katana(); 因此this是指window