请注意,我是 JavaScript世界的初学者,我对以下简单示例有疑问,
function myFun(){
return arguments;
}
var myVar=myFun("a","b","c");
//1
console.log(myVar); //=>//["a", "b", "c", callee: function, Symbol(Symbol.iterator): function]
//2
for(m in myVar){
console.log(m); //will generate only the realistic arguments "a","b","c".
}
根据上面的片段,
为什么第一次调用使用Function主对象中的继承属性生成arguments对象,第二次调用只生成实际参数.
如果我们将arguments对象传递给第二个函数,为什么它只能与实际数据一起传递,例如
function foo(something) {
console.log(something); ///=>this will generate number 3 as parameter only, not the rest of the object
return this.a + something;
}
var obj = {
a: 2
};
var bar = function() {
return foo.apply( obj, arguments );
};
var b = bar( 3 ); // 2 3
如在console.log(某物)的行中所指出的那样,它只会产生真实的参数
最佳答案 下一个示例中的错误是interessting:
function foo() { }
foo.apply(null, 5);
错误说(在谷歌浏览器上):
CreateListFromArrayLike
is called on non-object.
所以显然在将参数传递给函数之前首先应用函数调用,CreateListFromArrayLike将在提供的对象中创建一个新对象(或数组),忽略进程中任何非类数组的属性.
注意:在Mozilla Firefox上,它会抛出一个不同的错误,但我认为两个浏览器的引擎都采用相同的方式实现apply.