如上两种所示,当前的执行环境都是window,直接的去调用
函数调用模式很简单,是最基本的调用方式。 但是同样的是函数,将其赋值给一个对象的成员以后,就不一样了. 将函数赋值给对象的成员后,那么这个就不在称为函数,而应该叫做方法. 其可以看做为当前对象的方法,如果当前对象是类(可以看作为静态方法,我的理解)
类似的情况,和上面的差不多
同样是函数,在单纯的函数模式下,this 表示 window。
在对象方法模式下,this 指的是当前对象。
除了这两种情况,JavaScript 中函数还可以是构造器
将函数作为构造器来使用的语法就是在函数调用前面加上一个 new 关键字。
这里的this指向对象本身
所有需要由对象使用的属性,必须使用 this 引导。
函数的 return 语句意义被改写,如果返回非对象,就返回this。
首先定义了函数Person,当程序执行到这里时不会执行函数体,因此 JavaScript 的解释器并不知道这个函数的内容。
接下来执行new关键字,创建对象,解释器开辟内存,得到对象的引用,将新对象的引用交给函数
紧接着执行函数,将传过来的对象引用交给this。也就是说,在构造方法中,this 就是刚刚被 new 创建出来的对象。
然后为 this 添加成员,也就是为对象添加成员。
最后函数结束,返回 this,将 this 交给左边的变量。
分析过构造函数的执行以后,可以得到,构造函数中的 this 就是当前对象。
在构造函数中 return 的意义发生了变化。
首先如果在构造函数中,如果返回的是一个对象,那么就保留原意。
如果返回的是非对象比如数字、布尔和字符串。那么就返回this。
如果没有 return 语句,那么也返回 this。
例子:返回新的对象
例子:返回其他或者不返回
除了上述三种调用模式以外,函数作为对象还有 apply 方法与 call 方法可以使用,这便是第四种调用模式。
因为函数本身就是对象拥有自己的方法。
例子1:XXX.apply(null) 无参数
例子2:传入新创建的对象
JQuery中刚刚开始的时候有很多的变量,代表相应的函数,就是如下这样调用的。
在javascript OOP中,定义一个类.
主要的目的就是为了重用,修改了当前的执行环境而已。
但是如果我们有一个对象 var dog = {food:”bone”},我们不想对它重新定义say方法,
那么我们可以通过call或apply用cat的say方法:cat.say.call(whiteDog);
所以,可以看出call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。
用的比较多的,通过document.getElementsByTagName选择的dom
节点是一种类似array的array。
它不能应用Array下的push,pop等方法。
我们可以通过:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName(“*”));
这样domNodes就可以应用Array下的所有方法了。
https://www.zhihu.com/question/20289071
http://www.jb51.net/article/49230.html