好的,我是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] 删除。
我来说两句