理解方法借用存在困难

3
我不理解这段代码,或者说我对“方法借用”有疑惑。
   function func() {
      [].join.call(arguments)   //how does this works?
   {

join方法只需要一个分隔符参数,为什么我们要传递this上下文值呢?更有趣的是,它确实有效!

有人可以向我解释一下吗?

:)


1
arguments是类似数组的对象,但它不包含join方法。你可以从数组中借用join方法,并在arguments上下文中调用它的join方法,这将会返回一个包含参数值的字符串,而不是空数组(如果你也传递了分隔符参数)。 - Teemu
1个回答

1

.call() 方法用于函数上,它的行为类似于使用 () 调用函数,例如当您执行 functionName() 时,但它允许您明确定义函数内部的 this 是什么,例如:

function functionName(arg) {
  console.log("this", this); // this {"foo": 1}
  console.log("arg", arg); // arg str
}

functionName.call({foo: 1}, "str");

请注意,上面的.call()的第一个参数定义了函数内部的this是什么,而第二个参数及其后面的参数则定义了functionName的参数是什么。我们可以在任何函数上使用.call(),包括JavaScript提供给我们的函数。在你的代码中,你正在使用[].join,它公开(而不是调用)数组的join函数,也就是说,它让你可以访问在Array.prototype对象上定义的join函数。考虑到这一点,你的代码可以重写如下,以突出显示[].join只是用来从数组原型中获取join函数的:

function func() {
  const joinFn = Array.prototype.join; // or: [].join;
  console.log(joinFn.call(arguments));
}
func('a', 'b', 'c'); // "a,b,c"

在数组内部,.join() 方法使用 this(类似于 functionName() 内部使用 this)来确定需要将其元素“连接”在一起的对象/数组。在您的示例中,您没有直接在空数组上调用 .join(即:[].join()),而是使用空数组来访问 .join 函数,然后使用 arguments 对象 通过 join.call(arguments) 调用它。这样做时,.join() 方法内部的 this 被设置为 arguments 对象,并且不带参数地调用 join 方法,因此分隔符默认为 ,。由于 arguments 对象是 类数组对象(它具有像数组一样的索引和 length 属性),因此可以像数组的元素一样将其元素连接在一起。
您可以查看 ECMAScript 规范的 23.1.3.15 节,以了解更多关于 Array.prototype.join 内部工作原理以及如何使其通用以处理类数组对象而不仅仅是数组的详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接