JavaScript call和apply的区别

昨在做面试题时遇了当下道题:

下面关于JavaScript中 call和apply的描述,错误的是?

  1.  
     call与apply都属于Function.prototype的一个艺术,所以每个function实例都来call、apply属性
  2. 两者传递的参数不同,call函数第一只参数还是要传播给当下目标的目标,apply不是

  3. apply传入的凡一个参数数组,也不怕是用大半独参数组合成一个数组传入

  4. call传入的虽然是一直的参数列表。call 方法而将一个函数的靶子及下文从开头的上下文改变为由 thisObj 指定的新目标。

答案:2

  

 Function.prototype.call()<——详细请点击

call() 方法调用一个函数,
其抱有一个指定的this价与分级地提供的参数(参数的列表)。

  注意:欠办法的图及 apply() 方法类似,只发生一个分别,就是call()措施接受的是几独参数的列表,而apply()主意接受之是一个饱含多单参数的数组

  语法

fun.call(thisObj[, arg1[, arg2[, ...]]])

    定义:调用一个靶的一个艺术,以任何一个靶替换当前目标。 
    说明: 
      call 方法可据此来代替其他一个目标调用一个措施。call
方法可拿一个函数的对象上下文从开的上下文改变为由 thisObj
指定的初目标。 
      如果无供 thisObj 参数,那么 Global 对象吃作 thisObj。

  参数

thisObj

    在fun函数运行时指定的this欲注意的是,指定的this值并不一定是欠函数执行时真的this价值,如果这函数处于非严格模式下,则指定为nullundefined的  

    this值会自动指向大局对象(浏览器被就是是window对象),同时值也原始值(数字,字符串,布尔值)的this会晤靠于该原始值的机动包对象。

arg1, arg2, ...

    指定的参数列表。

返回值

返结果连指定的this价值和参数。

Function.prototype.apply()<——详细请点击

apply() 方法调用一个函数,
其具备一个指定的this价值,以及作为一个数组(或恍如数组的靶子)提供的参数。

  

语法

fun.apply(thisObj, [argsArray])

  定义:应用某平目标的一个措施,用别样一个目标替换当前目标。 
  说明: 
    如果 argsArray 不是一个得力的数组或者未是 arguments
对象,那么用招致一个 TypeError。 
    如果没供 argArray 和 thisObj 任何一个参数,那么 Global
对象将受看做 thisObj, 并且无法为传送任何参数。

参数

  thisObj

    在 fun 函数运行时指定的 this 值。需要留意的是,指定的 this 值并不一定是拖欠函数执行时真的 this 值,如果这函数处于非严格模式下,则指定

    为 null 或 undefined 时会自动指向大局对象(浏览器被虽是window对象),同时值也原始值(数字,字符串,布尔值)的 this 会指向该原始值的全自动包对象。

  argsArray

    一个数组或者类数组对象,其中的数组元素用当单身的参数传给 fun 函数。如果该参数的价为null 或 undefined,则代表不需传入任何参数。从ECMAScript
5

     开始好行使类数组对象。

总结

两岸作用一样,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的性和措施。或者说thisObj『继承』了obj的属性和办法。

唯一区别是apply接受的凡数组参数,call接受的是接二连三参数。
call()方法及apply()方法的意图一样,他们之界别在接收参数的法子各异。对于call(),第一只参数是this值没有生成,变化的凡外参数还直接传送给函数。(在动用call()方法时,传递给函数的参数必须逐项个列举出。使用apply()时,传递让函数的凡参数数组)如下代码做出解释:

function add(c, d){ 
    return this.a + this.b + c + d; 
} 
var o = {a:1, b:3}; 
add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16 
add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34 

call 和 apply 都是为了改变有函数运行时的 context
即高达下文而存在的,换句话说,就是以转移函数体内部 this 的指向。因为
JavaScript
的函数存在「定义时达到下文」和「运行时达下文」以及「上下文是得转的」这样的定义。

两边的企图了相同,只是接受参数的措施不极端相同。例如,有一个函数 fun
定义如下:

var fun = function(arg1, arg2) {};

不怕好透过 fun.call(this, arg1, arg2); 或者 fun.apply(this, [arg1,
arg2]); 来调用。其中 this 是若想指定的上下文,他可以另外一个 JavaScript
对象(JavaScript 中整整都对象),call 需要拿参数按梯次传递进入,而 apply
则是管参数放在数组里。

JavaScript
中,某个函数的参数数量是勿定点的,因此如果说适用原则的语,当您的参数是有目共睹了解数码时,用
call,而休确定的时光,用 apply,然后拿参数 push
进数组传递进入。当参数数量不确定时,函数内部也可由此 arguments
这个数组来遍历所有的参数。