javascript中的引用类型

Kev*_*vin 3 javascript

obj = {
  go: function() { alert(this) }
}

obj.go(); // object

(obj.go)(); // object

(a = obj.go)(); // window

(0 || obj.go)(); // window
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么后两个打印窗口对象和前两个打印引用.

jfr*_*d00 6

当您直接执行方法时,就像最后两个表单一样,this指针不会设置为对象.当不处于严格模式时,它被设置为window(在严格模式下,它将被设置为undefined,这有助于您捕获错误).该this指针将根据您如何调用javascript中设置的东西.

始终确保this指针相应设置的最简单方法是始终在对象的上下文中调用方法,如:

obj.go();
Run Code Online (Sandbox Code Playgroud)

这里有些例子:

obj.method()    // this in method automatically set to obj

var a = obj.method();
a();            // this set to window as no object context is provided

var a = obj.method();
a.call(obj)     // this explicitly set to obj by .call()
a.apply(obj)    // this explicitly set to obj by .apply()
Run Code Online (Sandbox Code Playgroud)

你应该记住的是,这obj.go只是javascript中最初存储为属性的函数obj.但是,一旦你获得了属性值,它就只是一个函数指针,不再与任何特定对象有任何明确的关联.如果希望this在方法中适当地设置指针,则必须给它一个对象,如何调用它.这与其他一些语言不同,并且与JS中的许多不同的东西不同,它既可以是您可以利用的功能,也可能是偶尔令人困惑的学习.