javascript – 参数对象类型转换

请注意,我是 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.

点赞