1
function test()
{
alert(Array.join.call(arguments,'/')) //alerts /
alert(Array.prototype.join.call(arguments,'/')) //alerts Js/JScript
alert(Array.join(arguments,'/')) //alerts Js/JScript
}
test('Js','JScript');

为什么会有这种差异?为什么需要先引用原型?还有为什么即使 join 只需要一个分隔符参数, Array.join 也会给出所需的结果。

4

2 回答 2

5

Array.join是一个全局函数。使用 call 时,作为第一个参数传递的是函数体内的对象this然后是函数的参数。joinjoin

js> Array.join.call(null, [1, 2], "/")   
"1/2"

Array.prototype.join是 的实例Array。因此,它期望this是实际的数组,这就是您的第二个示例有效的原因。Array.prototype.join您的第二个示例相当于调用this对象存在arguments,即是arguments.join("/")。有关说明,请参阅MDN

于 2012-05-26T15:53:50.280 回答
1

这是必要的,因为 Arguments 数组实际上并不是真正的 Array 对象。. 规范将其称为“类数组”,但它不包含任何通常与 JavaScript 数组相关的方法,例如join.

因此,上面的代码所做的是直接调用 Array 方法,使用call,并将 Arguments 对象作为方法的范围传递。

本质上,它导致解释器将 Arguments 数组视为真正的数组,以便可以在其上执行这些方法。

于 2012-05-26T15:49:06.337 回答