10

argumentsこのように使用するとエラーが発生するのはなぜですか?

function sum(){
    return arguments.reduce(function(a,b){
        console.log(a+b)
        return a+b;
    },0);
}

sum(1,2,3,4);

エラー:

/Users/bob/Documents/Code/Node/hello.js:2
return arguments.reduce(function(a,b){
                 ^
TypeError: Object #<Object> has no method 'reduce'
    at sum (/Users/bob/Documents/Code/Node/hello.js:2:19)
    at Object.<anonymous> (/Users/bob/Documents/Code/Node/hello.js:8:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:903:3

これはCrockford氏のJSレクチャーからです。

4

3 に答える 3

28

argumentsは実際の配列ではなく、「配列のような」オブジェクトでありreduce、配列のようなオブジェクトのメソッドではありません。次のように、コンテキストとしてreduce渡すことで使用できます。arguments

[].reduce.call(arguments, function(a, b) {

});

編集:配列のようなオブジェクトの詳細については、ここMDNを参照してください。

于 2013-03-28T20:11:10.753 に答える
0

argumentsオブジェクトはリストではないため、エラーが発生します。次の点を考慮してください。

> function a(){ return arguments; }
> b = a(1, 2, 3);
> b
{ '0': 1,
  '1': 2,
  '2': 3 }

の MDN JavaScript ドキュメントにargumentsは、次のような詳細情報があります。

関数に渡される引数に対応する配列のようなオブジェクト。

于 2013-03-28T20:13:34.813 に答える