浅谈javascript中的call()和apply()方法
话说在js中,每个函数都包含两个非继承而来的放方法,apply()和call(),使得我们能在特定的作用域中调用函数。
官方定义:
语法: fun.call(thisArg[, arg1[, arg2[, ...]]]
参数
thisArg
- 在
fun
函数运行时指定的this
值。
需要注意的是,指定的this
值并不一定是该函数执行时真正的this
值,如果这个函数处于非严格模式下,则指定为null
和undefined
的this值会自动指向
全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this
会指向该原始值的自动包装对象。 arg1, arg2, ...
- 指定的参数列表。
- -------------------------------------------------------------------------------------------------------------------------------------------------------------------
其实有一句我觉得特别经典的描述就是:
通过 call 方法,
你可以在一个对象上借用另一个对象上的方法,
咱先来谈谈其共同点:
先以call为例:
window.color = "red"; var o = {color: "blue"}; function sayColor(){ alert(this.color); console.log(this); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue在上面的代码中,分别调用了四次sayCokor()函数,第一次,直接调用,与第二个以当前this为对象调用(sayColor(this)),以及直接以window作为对象调用,都是指的当前window对象(可以理解为全局对象),返回window的color属性,而在第四次调用时,将对象o传了过去,此时sayColor方法所调用的color属性就是对象o的color属性了。
而对于apply():
其实现和call几乎一样,而两者区别在于,当函数需要传入参数时,apply()可以使用参数数组,而call()只能将参数一个一个的传过去。
例:
apply(this , [num1 , num2]);
call(this , num1 , num2);
具体使用环境也是依情况而定的。
说说他们的有点: 不需要对象和方法有任何耦合关系,一般来说,除了window对象以外,我们是很难去直接用对象去掉用和这个对象没有半毛线关系或同处于一个作用域内的方法的。
顺便添加一下最近用到的这两个函数的语句:
如何获取数组中的最大最小值:
var max2 = Math.max.apply(Math,values);
吧Math对象作为apply()的第一个参数,从而正确的设置this值。
知识点补充:window对象,WEB浏览器一般讲全局变量作为window对象的一部分属性加以实现。因此,在全局作用域下声明的所有变量和函数,就都称为了window对象的属性。