从我的另一个帖子中解放出来,这里比你想知道的更多 .
在我开始之前,这里's the most important thing to keep in mind about Javascript, and to repeat to yourself when it doesn' t有意义 . Javascript没有类(ES6 class 是syntactic sugar) . 如果看起来像一个类,这是一个聪明的伎俩 . Javascript有 objects 和 functions . (那不是100%准确,函数只是对象,但有时可以将它们视为单独的东西有帮助)
此变量附加到函数 . 无论何时调用函数,都会给出一定的值,具体取决于您调用函数的方式 . 这通常称为调用模式 .
有四种方法可以在javascript中调用函数 . 您可以将函数作为方法,函数,构造函数和apply来调用 .
作为一种方法
方法是附加到对象的函数
var foo = {};
foo.someMethod = function(){
alert(this);
}
当作为方法调用时,它将绑定到函数/方法所属的对象 . 在这个例子中,这将绑定到foo .
作为一个功能
如果你有一个独立的函数,这个变量将被绑定到"global"对象,几乎总是在浏览器的上下文中的窗口对象 .
var foo = function(){
alert(this);
}
foo();
This may be what's tripping you up ,但不要为什么你看到看似不一致的行为 .
很多人通过这样做来解决这个问题
var foo = {};
foo.someMethod = function (){
var that=this;
function bar(){
alert(that);
}
}
您定义一个指向此的变量 . Closure(一个它自己的主题)保持这种状态,所以如果你把bar称为回调,它仍然有一个引用 .
注意:在 use strict 模式中,如果用作函数, this 不会绑定到全局 . (这是 undefined ) .
作为构造函数
您还可以将函数作为构造函数调用 . 根据您正在使用的命名约定(TestObject),这也是 may be what you're doing and is what's tripping you up .
使用new关键字将函数作为构造函数调用 .
function Foo(){
this.confusing = 'hell yeah';
}
var myObject = new Foo();
当作为构造函数调用时,将创建一个新的Object,并将绑定到该对象 . 同样,如果你有内部函数,那么它们将作为函数调用它们,并且它将被绑定到全局对象 . 使用那个=这个技巧/模式的var .
有些人认为构造函数/ new关键字是Java /传统OOP程序员抛出的骨骼,作为创建类似于类的东西的方法 .
使用Apply方法
最后,每个函数都有一个名为"apply"的方法(是的,函数是Javascript中的对象) . Apply允许您确定它的值,并允许您传入一组参数 . 这是一个无用的例子 .
function foo(a,b){
alert(a);
alert(b);
alert(this);
}
var args = ['ah','be'];
foo.apply('omg',args);