首页 > 试题广场 >

下面有关JavaScript中 call和apply的描述,

[单选题]
下面有关JavaScript中 call和apply的描述,错误的是?
  • apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入
  • call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性
  • 两者传递的参数不同,call函数第一个参数都是要传入给当前对象的对象,apply不是
  • call传入的则是直接的参数列表。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

做个搬运工,不用百度了,一看就能理解

https://wy310.cn/2019/12/18/what-is-call-and-apply/

发表于 2019-12-30 08:49:05 回复(4)
C apply和call传入的第一个参数都是需要指向的对象,也就是传入给当前函数的对象。
对于剩余参数,apply传入的是一个参数列表,也就是数组,而call传入的是一个一个的参数。
发表于 2019-09-07 17:07:51 回复(0)

【摘自JavaScript高级程序设计】

函数还有两个方法:apply()和call()。这两个方法都会以指定的this值来调用函数,即会设置调用函数时函数体内this对象的值。apply()方法接收两个参数:函数内this的值和一个参数数组。第二个参数可以是Array的实例,但也可以是arguments对象。来看下面的例子:

function sum(num1, num2) {
  return num1 + num2;
}

function callSum1(num1, num2) {
  return sum.apply(this, arguments); // 传入arguments对象
}

function callSum2(num1, num2) {
  return sum.apply(this, [num1, num2]); // 传入数组
}

console.log(callSum1(10, 10));  // 20
console.log(callSum2(10, 10));  // 20

在这个例子中,callSum1()会调用sum()函数,将this作为函数体内的this值(这里等于window,因为是在全局作用域中调用的)传入,同时还传入了arguments对象。callSum2()也会调用sum()函数,但会传入参数的数组。这两个函数都会执行并返回正确的结果。

注意 在严格模式下,调用函数时如果没有指定上下文对象,则this值不会指向window。除非使用apply()或call()把函数指定给一个对象,否则this的值会变成undefined。

call()方法与apply()的作用一样,只是传参的形式不同。第一个参数跟apply()一样,也是this值,而剩下的要传给被调用函数的参数则是逐个传递的。换句话说,通过call()向函数传参时,必须将参数一个一个地列出来,比如:

function sum(num1, num2) {
  return num1 + num2;
}

function callSum(num1, num2) {
  return sum.call(this, num1, num2);
}

console.log(callSum(10, 10)); // 20

这里的callSum()函数必须逐个地把参数传给call()方法。结果跟apply()的例子一样。到底是使用apply()还是call(),完全取决于怎么给要调用的函数传参更方便。如果想直接传arguments对象或者一个数组,那就用apply();否则,就用call()。当然,如果不用给被调用的函数传参,则使用哪个方法都一样。

apply()和call()真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内this值的能力。考虑下面的例子:

window.color = 'red';
let o = {
  color: 'blue'
};

function sayColor() {
  console.log(this.color);
}

sayColor();             // red

sayColor.call(this);    // red
sayColor.call(window);  // red
sayColor.call(o);       // blue

这个例子是在之前那个关于this对象的例子基础上修改而成的。同样,sayColor()是一个全局函数,如果在全局作用域中调用它,那么会显示"red"。这是因为this.color会求值为window.color。如果在全局作用域中显式调用sayColor.call(this)或者sayColor.call(window),则同样都会显示"red"。而在使用sayColor.call(o)把函数的执行上下文即this切换为对象o之后,结果就变成了显示"blue"了。

使用call()或apply()的好处是可以将任意对象设置为任意函数的作用域,这样对象可以不用关心方法。在前面例子最初的版本中,为切换上下文需要先把sayColor()直接赋值为o的属性,然后再调用。而在这个修改后的版本中,就不需要这一步操作了。

编辑于 2020-09-25 22:08:11 回复(0)
call和apply传入的第一个参数都是传入给当前对象的对象,不同的是apply的第二个参数是数组类型的。可以通过apply开头与array一样来记忆。
发表于 2021-06-16 10:03:44 回复(0)
call,apply改变this指向,传参不同。
发表于 2019-06-29 23:38:03 回复(0)
call与apply的第一个参数都为this的指向,call后面的参数为传入的参数列表,apply为参数的数组.

发表于 2022-11-03 12:44:56 回复(0)
call apply bind三种方法都可以改变this指向 1、三种方法的第一个参数都是this改变后的指向 2、区别:传参方式不同 fun.call(obj1,‘男’,‘敲代码’) fun.apply(obj1,[‘男’,‘敲代码’]) fun.bind(obj1,‘男’,‘敲代码’)()
发表于 2022-09-05 10:59:32 回复(0)
call与apply的第一个参数都为this的指向,call后面的参数为传入的参数列表,apply为参数的数组.
发表于 2023-10-19 09:23:04 回复(0)
function可以通过原型链找到call和apply
发表于 2023-04-11 18:32:37 回复(0)

选项B,应该不太严谨吧。 
实际上function实例并没有call和apply这两个属性。 这个两个属性是通过原型链查找到的。
或者换个说法,每个funciton实例都能调用call和apply两个方法?
发表于 2022-11-20 21:19:24 回复(0)
call和apply都是传入两个参数,第一个都是传入当前函数的对象
第二个参数,call是传入数组中的每个元素,apply是传入整一个数组列表,call是apply的语法糖
apply可以用于讲数组拆分成多个元素集合
发表于 2021-06-26 17:06:19 回复(0)
B为什么有呢,
发表于 2020-03-29 13:30:37 回复(0)