Call Apply

于js中call,apply的区别网上已经讲的很详细了。MDN上这样说:

call()方法的语法和作用与 apply() 方法类似,只有一个区别,就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组

这篇文章讲一些这两个方法使用需要注意的一些细节。

今天在MDN上查询了一下arguments对象,上面这样说:

arguments 是一个对应于传递给函数的参数的类数组对象。arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。

如果我们想将它转化为真正的数组该怎么办呢?MDN上提供了如下四种方法:

function toRealArray() {  
  var args = Array.prototype.slice.call(arguments);
  console.log(args);
  var args = [].slice.call(arguments);
  console.log(args);

  // ES2015
  const args = Array.from(arguments);
  console.log(args);
  const args = [...arguments];
  console.log(args);
  
  // Array构造函数
  var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
  console.log(args);
}

toRealArray(1, 2, 3, 4);

其中这一句一开始看有点懵: var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)); 这里apply的第一个参数null是什么意思呢?经过网上查询,在非严格模式下,当call和apply的第一个参数是null/undefined时函数内的的this指向window或global,传null或undefined时,将是JS执行环境的全局变量。浏览器中是window,其它环境(如node)则是global。

也就是说,当一个函数后加上.apply(null)时,就相当于调用了一次这个函数。

加载评论