25

通常のオールインザファミリーJS開発者(me)定義関数と、事前定義されたDOMメソッドの両方について知りたいです。attachEventWHATWGの署名を使用してIEを呼び出そうとするとどうなりaddEventListenerますか?例えば、

elem.attachEvent('onbillgates\'mom', function(e){ this.mount(); }, false);

具体的には、に注意してくださいfalseattachEventメソッドのシグニチャが2つの引数しか必要としない場合でも、それは何かをトリップしますか?

ありがとう。

function foo(FirstOf2, SecondOf2) {
  console.log(FirstOf2 + SecondOf2);
}

foo(1, 2, true);
4

5 に答える 5

25

JavaScriptには、固定パラメーターリストの概念がありません。独自の関数の場合、いつでも必要な数のパラメーターを指定し、必要なタイプを指定して渡すことができます。

ネイティブコードに相関する組み込み関数の場合は、に依存します

あなたはそれが何に依存するかについて尋ねました:

ECMA-262を見てみましょう

組み込み(ホストと混同しないでください)関数全般に関するセクション15

特定の関数の説明で特に指定されていない限り、この句で説明されている関数またはコンストラクターに必要な引数が指定されている数よりも少ない場合、関数またはコンストラクターは、十分な追加の引数が指定されているかのように正確に動作します。そのような引数は未定義の値です。

大丈夫。必要な数より少ない引数を渡す場合は、関数自体の仕様によって異なります(セクション15を下にスクロールして、各組み込み関数の仕様を見つけてください)。

特定の関数の説明で特に指定されていない限り、この句で説明されている関数またはコンストラクターに、関数が許可するように指定されているよりも多くの引数が指定されている場合、余分な引数は呼び出しによって評価され、関数によって無視されます。ただし、実装は、動作が単に追加の引数の存在を前提とするTypeError例外のスローでない限り、そのような引数に関連する実装固有の動作を定義できます。

あまりにも多くの引数を渡すと、TypeErrorが発生することはありません。しかし、それでも他のエラーが発生する可能性があります。繰り返しますが、それはあなたが話している機能に依存します。

組み込み関数ではなく、DOMについて明示的に話していました。正直なところ、仕様の対応する部分が見つかりません。ECMA仕様は、w3Webサイトよりもはるかに読みやすくなっています。

于 2012-10-02T16:12:15.563 に答える
7

傷つけません。関数コードがいくつかの未定義の値で問題ない限り、必要なパラメーターよりも少ないパラメーターで関数を呼び出すこともできます。

于 2012-10-02T16:23:03.777 に答える
4

私はこの重要な、しかし古い質問に出くわしました。そして、将来の世代が私の実験を共有することが有益になることを願っています。

  1. arguments関数のシグネチャ内の引数の量に関係なく、関数の引数にアクセスするためにオブジェクトを使用できます。
    これは矢印関数には適用されないことに注意してください。

function singleArg(x) {
  console.log(arguments);
}

singleArg(1, 2); // Called with 2 arguments
singleArg();     // Called with 0 arguments

// Results in an error, as 'arguments' isn't defined for arrow functions
((arg) => console.log(arguments))(1);

  1. それは正確には:ではないドキュメントに記載されています:argumentsArray

「配列のような」とは、引数に長さプロパティとゼロからインデックス付けされたプロパティがあるが、forEach()やmap()のような配列の組み込みメソッドがないことを意味します。

したがって、次のコードはエラーになります。

(function singleArg(x) {
  console.log(arguments); // This line works
  arguments.forEach(x => console.log(x)); // This causes an error
})(1, 2);

  1. シグニチャよりも引数が少ない関数を呼び出すと、次のように割り当てられますundefined

(function twoArgs(a, b) {
  console.log(`a: ${a}\nb: ${b}`);
})(1);

于 2019-07-24T09:39:16.397 に答える
0

この投稿とおそらくこれを見てみてください。

MDNから:

オブジェクトは、すべての関数arguments内で使用可能なローカル変数です。Functionのプロパティとしては使用できなくなりました。arguments

argumentsオブジェクトを使用して、関数内の関数を参照できargumentsます。このオブジェクトには、関数に渡される各引数のエントリが含まれています。最初のエントリのインデックスは0から始まります。

正式に受け入れるように宣言されているarguments以上の関数を呼び出す場合 は、オブジェクトを使用できます。argumentsこの手法は、可変数の引数を渡すことができる関数に役立ちます。

function myConcat(separator) {
  var result = "";

  // iterate through non-separator arguments
  for (var i = 1; i < arguments.length; i++) {
    result += arguments[i] + separator;
  }

  return result;
}
于 2012-10-02T16:14:25.627 に答える
-1

暗黙の引数配列を明示的に処理しない限り、混乱することはないと思います。なぜあなたはこれをしているのですか?

于 2012-10-02T16:09:29.663 に答える