105

私はJavascriptの世界に不慣れで、非常に基本的な関数を書くことにいじくり回していて、偶然に以下の例に出くわしました.関数が要求するときにパラメーターを渡していないときになぜそれが機能するのかわかりません.

サンプル機能

function myfunction(x) {
    alert("This is a sample alert");
}

関数を呼び出すmyfunction();と、アラートが表示されます。パラメータを渡していないのに、エラーや警告なしで関数を呼び出せるのはなぜですか?

編集

私はこれほど多くのすばらしい回答を期待していませんでした。また、どの回答が最良であるかをまだ断言できる立場にないので、人々に最良の回答を提案するように依頼することができます。その人に承認を与えます。

4

8 に答える 8

128

つまり、javascript でパラメーターを渡すことはオプションであるため、エラーや警告は表示されません。
「提供」されなかったすべてのパラメーターには、undefinedが含まれます。

function foo(x, y, z){
    //...
}

foo(1);

関数の内部foo

function foo(x, y, z){
    x === 1
    y === undefined
    z === undefined
}

次のように、さらに引数を渡すこともできます。

foo(1,2,3,4,5,7); // Valid!

関数内から提供されるパラメーターの量を知ることができarguments.lengthます。

function foo(x, y, z) {
    console.log('x value: ' + x);
    console.log('y value: ' + y);
    console.log('z value: ' + z);
    console.log('Arguments length: ' + arguments.length);
}
console.log('Zero parameters');
foo();
console.log('Four parameters');
foo(1, 2, 3, 4);

任意の量のパラメーターを処理する便利な関数の例:

function max() {
    var maxValue = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        if (maxValue < arguments[i]) {
            maxValue = arguments[i];
        }
    }
    return maxValue;
}

alert(max(1, 5, 7, 2, 88, 32, 44));

于 2012-06-19T19:19:18.267 に答える
10

JavaScript 関数のすべての引数はオプションです (「緩やかに型付けされた」と読みます)。

JavaScript 関数は、関数定義で指定された引数の数に関係なく、任意の数の引数で呼び出すことができます。関数は緩やかに型付けされているため、期待される引数の型を宣言する方法はなく、任意の型の値を任意の関数に渡すことは合法です。宣言されているよりも少ない引数で関数が呼び出されると、追加の引数には未定義の値が含まれます。

名前付き引数変数または引数オブジェクトを使用して、関数内で関数の引数を参照できます。このオブジェクトには、関数に渡される各引数のエントリが含まれます。最初のエントリのインデックスは 0 から始まります。たとえば、関数に 3 つの引数が渡される場合、次のように引数を参照できます。

arguments[0]
arguments[1]
arguments[2]
  • JavaScript - 決定版ガイド、第 5 版
于 2012-06-19T19:19:01.183 に答える
7

それがJavaScriptの仕組みです。パラメータはオプションであり、関数呼び出しに欠落している場合、実際には値ではない値「未定義」が関数に含まれます。

「オプション」とは、つまり、任意の関数の呼び出しには、任意の長いパラメーターのリストが含まれることを意味します。関数に渡されるパラメータの数と宣言された数の間に関係がある必要はありません。この宣言を考える最良の方法は、次のとおりです。

function x(a, b, c) {
  // ...
}

関数を宣言し、名前「a」を最初のパラメーターに、「b」を 2 番目のパラメーターに、「c」を 3 番目のパラメーターにバインドしていることです。ただし、これらのいずれかが、後で関数を呼び出したときに実際に値にバインドされることは決して保証されません。

同様に、パラメータをまったく指定せずに関数を定義してから、argumentsオブジェクトを介してそれらを「検索」できます。

function noArgs() {
  var a = arguments[0], b = arguments[1], c = arguments[2];
  // ...
}

これは最初の関数とまったく同じではありませんが、実質的に数えられるほとんどの点で似ています。

JavaScript の「未定義」の値は値ですが、そのセマンティクスは、言語が進むにつれて少し変わっています。null特に、値とまったく同じではありません。また、「未定義」自体はキーワードではありません。それは単なる半特殊な変数名です!

于 2012-06-19T19:19:00.053 に答える
4

JavaScript には、他の言語のように関数パラメーターのデフォルト値がありません。したがって、必要な数の引数を渡すことができます。

値を渡さない場合、パラメーターはundefined.

function myfunction(x) {
    alert(x);
}

myfunction(); // alerts undefined
myfunction(1); // alerts 1
myfunction(1,2,3); // alerts 1

署名よりも多くのパラメータを渡す場合は、arguments.

function myfunction(x) {
    alert(x);
    console.log(arguments);
}

myfunction(1,2,3); // alerts 1, logs [1,2,3]
于 2012-06-19T19:20:07.803 に答える
2

関数で言及されているものだけでなく、より多くの引数を提供することもできます

myFunction(1,2,3,4,5,6,7,'etc');

arguments提供された引数を表示するために、配列であるプロパティを使用できます。

于 2012-06-19T19:21:54.323 に答える
1

関数が渡すことになっているパラメーターを操作できると予想されるまで、エラーは発生しないためです。

例えば:

function myfunction(x) {
    return x*2;
}

エラーをスローします。おそらく a NaN(この場合) またはvariable is undefined.

于 2012-06-19T19:19:08.867 に答える
0

引数を省略した場合、その値は になりますundefined。これにより、オプションのパラメーターを非常に簡単に作成できます。

もう 1 つの機能は、argumentsオブジェクトを利用して、パラメーターなしで関数を定義し、引数付きで正常に呼び出すことができることです。これにより、可変長の引数配列を簡単に作成できます。

于 2012-06-19T19:23:39.730 に答える