在函数“这个”关键词(The 'this' keyword in functions

2019-10-29 15:43发布

从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.isSharptrue )。 换句话说,正是做了this是指什么?

怎么会isSharp作为一个对象创建?

Answer 1:

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()如果f()返回一个对象。

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



Answer 2:

不要使用new ,所以this是全局对象( window的功能)。

katana();

是真的

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

这就是为什么断言isSharp===true ,测试其实window.isSharp ,返回true

如果你想创建的新实例katana ,用new katana()然后this将是函数内部的新实例,留下window.isSharp不变。



Answer 3:

不在于创建一个对象应该具备哪些属性格式isSharp,它的价值会是真的吗?

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

确定的值, this在JavaScript函数内可能会造成混淆,因为它是动态确定,取决于函数是如何被调用。 基本规则是, this将是全球对象,除非:

  • 该函数被称为一个对象的方法(那么这将是该对象),或
  • 函数被调用作为构造,与新的操作员(在这种情况下,这将指向要构造的新物体)

有关详细信息MDN



Answer 4:

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

你的情况是window.katana(); 所以, this是指window



文章来源: The 'this' keyword in functions