参数对象类型转换

youhana

好的,我是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(something)行中指出的那样,它将仅生成实际的参数

易卜拉欣·马尔里尔

下一个示例中的错误是什么:

function foo() { }

foo.apply(null, 5);

错误显示(在Google Chrome上):

CreateListFromArrayLike 在非对象上被调用。

因此,显然apply在将参数传递给函数之前先调用该函数,CreateListFromArrayLike将在提供的对象中创建一个新对象(或数组),而忽略该过程中的任何非数组类属性。

注意:在mozilla firefox上,它引发了一个不同的错误,但是我认为两个浏览器的引擎都具有相同的实现方式apply

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章