ECMAScriptJavaScript 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
这些数组来遍历所有的参数。