请说我是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(某事)一行中指出的那样,它只会生成真实的参数
答案 0 :(得分:1)
as @ibrahim mahrir评论和本文this 我发现,apply会将对象强制转换为数组,这是一个例子,
function toArray(args) {
return Array.prototype.slice.call(args);
}
function firstFun(){
console.log(toArray(arguments));
}
firstFun("A","b");
///这将相等,第二个提供问题本身的例子, 谢谢@ibrahim,正确答案属于他。
答案 1 :(得分:1)
下一个例子中的错误是有趣的:
function foo() { }
foo.apply(null, 5);
错误说(在谷歌浏览器上):
在非对象上调用
CreateListFromArrayLike
。
显然apply
在将参数传递给函数之前先调用该函数,CreateListFromArrayLike
将从提供的对象(或数组)中创建一个新的对象(或数组),忽略任何非类数组的属性。这个过程。
注意:在Mozilla Firefox上,它会引发不同的错误,但我认为两种浏览器的引擎都采用相同的方式实现apply
。