我正在学习arguments
对象在函数内部的工作原理。我注意到理论上,这个对象将传递给函数的所有参数。
在实践中,我有不同的结果。
以下代码是一个测试函数,它打印它收到的参数:
function test(myArgs){
console.log(`myArgs: ${myArgs}`);
console.log(`arguments obj: ${JSON.stringify(arguments)}`);
console.log(`arguments array ${JSON.stringify(Array.from(arguments))}`);
}
第一行打印myArgs
,另外两行以不同的方式打印arguments
对象。
使用简单的函数执行函数:
test("hello", 56, 60, 5);
myArgs: hello
arguments obj: {"0":"hello","1":56,"2":60,"3":5}
arguments array ["hello",56,60,5]
当我将一个函数作为参数之一传递出来时,问题就出现了,比如说,回调:
test("hello", () => console.log("HelloWorld"), 60, 5);
myArgs: hello
arguments obj: {"0":"hello","2":60,"3":5}
arguments array ["hello",null,60,5]
这是非常意外的......
以下是一个举例说明此行为的代码段:
function test(myArgs){
console.log(`myArgs: ${myArgs}`);
console.log(`arguments obj: ${JSON.stringify(arguments)}`);
console.log(`arguments array ${JSON.stringify(Array.from(arguments))}`);
}
test("hello", 56, 60, 5);
test("hello", () => console.log("HelloWorld"), 60, 5);
答案 0 :(得分:3)
默认情况下,JSON.stringify()
不会对函数进行序列化。
......但它可以。提供自定义replacer
回调并自行处理函数序列化:
var values = [1, false, {foo:2}, function bar() {}];
console.log(JSON.stringify(values, function(key, value) {
if ("function" === typeof value) {
return value.toString();
}
return value;
}));

请参阅Function.prototype.toString()
和JSON.stringify(value, replacer)
。