从我的另一篇文章中摘录,这里有比你想知道的更多的东西。
在我开始之前,这里有关于Javascript最重要的事情要记住,当它没有意义的时候可以重复一遍。Javascript没有类(ES6的类是语法糖)。如果某个东西看起来像一个类,这是一个聪明的技巧。Javascript有对象和函数。(这不是100%准确,函数只是对象,但有时将它们视为独立的事物会有所帮助)
this变量被附加到函数上。无论何时调用函数,它都会被赋予一个特定的值,这取决于调用函数的方式。这通常称为调用模式。
在javascript中有四种调用函数的方法。可以作为方法、函数、构造函数和apply调用该函数。
作为方法
方法是附加到对象上的函数
var foo = {};
foo.someMethod = function(){
alert(this);
}
当作为方法调用时,它将被绑定到函数/方法所属的对象。在本例中,this将被绑定到foo。
作为功能
如果你有一个独立的函数,这个变量将被绑定到“全局”对象,几乎总是浏览器上下文中的窗口对象。
var foo = function(){
alert(this);
}
foo();
这可能是让你抓狂的原因,但不要难过。许多人认为这是一个糟糕的设计决策。由于回调是作为函数而不是作为方法调用的,这就是为什么您会看到不一致的行为。
很多人通过这样的方式来解决这个问题
var foo = {};
foo.someMethod = function (){
var that=this;
function bar(){
alert(that);
}
}
你定义一个变量,它指向这个。闭包(一个自己的主题)保留了这一点,所以如果你将bar作为一个回调调用,它仍然有一个引用。
注意:在严格使用模式下,如果用作函数,则不绑定到全局。(没有定义)。
作为构造函数
还可以将函数作为构造函数调用。根据您正在使用的命名约定(TestObject),这也可能是您正在做的事情,也可能是使您出错的事情。
使用new关键字作为构造函数调用函数。
function Foo(){
this.confusing = 'hell yeah';
}
var myObject = new Foo();
当作为构造函数调用时,将创建一个新的Object,并且this将绑定到该对象。如果你有内部函数,它们被用作回调,你会把它们作为函数调用,这将被绑定到全局对象。使用var that =这个技巧/模式。
有些人认为构造函数/new关键字对Java/传统OOP程序员来说是一种骨头,用来创建类似于类的东西。
使用Apply方法
最后,每个函数都有一个名为“apply”的方法(是的,函数在Javascript中是对象)。Apply允许您确定this的值,还允许您传入一个参数数组。这里有一个没用的例子。
function foo(a,b){
alert(a);
alert(b);
alert(this);
}
var args = ['ah','be'];
foo.apply('omg',args);