0

取自 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,因为它调用函数,所以katana.isSharp会是true)。换句话说,究竟this指的是什么?

怎么会isSharp被创建为对象?

4

4 回答 4

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()iff()返回的对象返回一个对象。

这一切都在规范中。很奇怪。

于 2013-03-19T18:06:37.000 回答
2

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

katana();

是真的

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

isSharp===true这就是实际测试的断言window.isSharp返回的原因true

如果要创建 的新实例katana,请使用new katana(),然后this将成为函数内部的新实例,保持window.isSharp不变。

于 2013-03-19T18:05:43.693 回答
2

这不是创建一个应该具有属性 isSharp 的对象,并且它的值是真的吗?

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

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

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

有关MDN的更多详细信息

于 2013-03-19T18:07:06.673 回答
0

this指调用的对象上下文。

在您的情况下,它window.katana();thiswindow

于 2013-03-19T18:08:52.363 回答