取自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
创建为对象?
答案 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
将是全局对象,除非:
有关MDN
的更多详情答案 3 :(得分:0)
this
指的是调用的对象上下文。
在你的情况下是window.katana();
因此this
是指window