函数的调用方式对函数内代码的执行有很大影响,主要体现在this参数以及函数上下文是如何建立的。
我们可以通过四种方式调用函数,每种之间都有细微区别。
1.作为一个函数直接调用
普通函数内部的this指向,在非严格模式下指向window对象,严格模式下指向undefined。
2.作为一个方法,关联在一个对象上
现在需要定义一个 ninja1 的对象,并包含一个名为 getMyThis 的属性,属性值为函数 whatsMyContext 的引用。这样就在对象上创建了一个名为 getMyThis 的方法。不要认为whatsMyContext 成为了 ninja1 的一个方法,whatsMyContext 是一个独立的函数,有多种调用方式。
这里,故意将第二个断言函数的对象ninja2改为ninja1,所以报错false。
通过上面实例发现,通过this返回的函数上下文依然取决于 whatsMyContext,如果通过ninja1调用 whatsMyContext,那么ninja1对象的方法getMyThis的上下文就是ninja1;同理ninja2也是这样。另外 ninja1 和 ninja2 共享了完全相同的函数,但是当执行时,该函数可以访问并操作所属对象的其他方法,因此我们不需要创建一个单独的函数副本 whatsMyContext 来操作不同的对象进行相同的处理。
将函数作为方法调用至关重要,这样就可以通过 this 在任何方法中引用该方法的“宿主对象”(使用this获取对象的引用ÿ