从我的另一篇文章拆解,这里有更多的比你想要知道这个。
在开始之前,请记住关于Javascript的最重要的内容,并在没有意义的情况下对自己重复一遍。Javascript没有类(ES6
class是语法糖)。如果某个东西看起来像一堂课,那是一个聪明的把戏。Javascript具有
对象 和 功能 。(这不是100%准确的,函数只是对象,但有时将它们视为独立的东西会有所帮助)
在 这个变量被附连到功能。当你调用一个函数,这个被赋予了一定的价值,这取决于你如何调用该函数。这通常称为调用模式。
有四种方法可以调用javascript中的函数。您可以将函数作为方法,函数, 构造函数以及apply调用。
作为一种方法
方法是附加到对象的函数
var foo = {};foo.someMethod = function(){ alert(this);}当作为一种方法被调用,这将被绑定到对象的功能/方法是的一部分。在此示例中,它将绑定到foo。
作为功能
如果您具有独立功能,则此变量将绑定到“全局”对象,几乎总是在浏览器上下文中的window对象。
var foo = function(){ alert(this); } foo();这可能是使您绊倒的原因 ,但并不难过。许多人认为这是一个错误的设计决定。由于回调是作为函数而不是方法调用的,因此这就是为什么您看到的行为似乎不一致。
很多人通过做类似的事情来解决这个问题
var foo = {};foo.someMethod = function (){ var that=this; function bar(){ alert(that); }}你定义一个变量 是 指向 这个 。闭包(它本身 就是 一个话题)可以解决这个问题,因此,如果您将bar作为回调调用,它仍然具有引用。
注意:在
use strict模式下,如果用作功能,
this则不绑定到全局。(是
undefined)。
作为建设者
您还可以将函数作为构造函数调用。根据您正在使用的命名约定(TestObject),这也 可能是您正在做的事情,并且是您的绊脚石 。
您可以使用new关键字将函数作为构造函数调用。
function Foo(){ this.confusing = 'hell yeah';}var myObject = new Foo();当作为一个构造函数调用时,一个新的对象将被创建,并且 这 将被绑定到该对象。同样,如果你有内部函数,他们正在使用回调,你会被调用它们的功能,并且 这
将被绑定到全局对象。使用该变量=此技巧/模式。
有人认为,构造函数/ new关键字是Java /传统OOP程序员的骨干,可以用来创建类似于类的东西。
使用Apply方法
最后,每个函数都有一个名为“apply”的方法(是的,函数是Javascript中的对象)。应用可以让你决定的价值来决定这将是,也可以让你在参数数组传递。这是一个无用的示例。
function foo(a,b){ alert(a); alert(b); alert(this);}var args = ['ah','be'];foo.apply('omg',args);


