从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
作为一个对象创建?
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()
返回一个对象。
这一切都在规范。 很奇怪。
不要使用new
,所以this
是全局对象( window
的功能)。
katana();
是真的
window.katana(); // the passed context is window
这就是为什么断言isSharp===true
,测试其实window.isSharp
,返回true
。
如果你想创建的新实例katana
,用new katana()
然后this
将是函数内部的新实例,留下window.isSharp
不变。
不在于创建一个对象应该具备哪些属性格式isSharp,它的价值会是真的吗?
没有,因为功能没有被引用作为构造。 如果你有var obj = new katana()
那么你会得到与对象isSharp
属性。 否则,它只是一个函数调用,所以我应该this
呢? JavaScript不知道,所以它决定是不确定的,并回落到全局对象(除非在严格模式下)。
确定的值, this
在JavaScript函数内可能会造成混淆,因为它是动态确定,取决于函数是如何被调用。 基本规则是, this
将是全球对象,除非:
- 该函数被称为一个对象的方法(那么这将是该对象),或
- 函数被调用作为构造,与新的操作员(在这种情况下,这将指向要构造的新物体)
有关详细信息MDN
this
指的是这个对象调用的上下文。
你的情况是window.katana();
所以, this
是指window