Javascript関数でパラメーターを渡さないとどうなりますか?


90

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

サンプル関数

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

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

編集

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



2
JSには関数のシグネチャに基づくオーバーロードがないため、関数が「期待する」パラメータの数は実際には関係ありません。関数が受け取るように定義されていないパラメーターを渡し、キーワード引数を使用してそれらを取得することもできます。
スクラップ

@ scrappedcola-関数が受け取るように定義されていないパラメーターをオーバーロードして渡すとはどういう意味ですか?例を挙げていただけますか?
PeanutsMonkey 2012年

2
@PeanutsMonkey。彼は、次の2つの機能を持つことができない、意味:function foo(x){...}そしてfunction foo(x,y,z){...}、あなたは、それぞれの名前のために一つだけの機能を持つことができます。
gdoronはモニカ・支援している

2
@PeanutsMonkey。はい、あなたはfunction overloadingjsで持つことはできません、あなたはそれをあざける他の方法があります。
–gdoronはMonicaをサポートしています2012

回答:


114

何も起こりません。つまり、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));


ライブデモをありがとう。それほど多くの良い答えを期待していませんでした。したがって、function myfunction (a,b){}myfunction(1,2,3,4,5)のような関数があり、値を渡した場合、それはまだ有効であると見なしますか?警告やエラーが発生することが予想されますか?
PeanutsMonkey 2012年

申し訳ありませんが、console.logarguments.lengthだけでなく、コマンドの機能についても詳しく説明していただけませんか。
PeanutsMonkey 2012年

@PeanutsMonkey。有効です!警告なしエラーなし、それも役に立ちます。すぐにデモを提供します。
–gdoronはMonicaをサポートしています2012

1
@PeanutsMonkey。開発者コンソールがインストールされている場合はIEでも動作しますが、IE8 +からデフォルトでインストールされていると思います。私はあなたが何について書いたのか理解できませんでしたalert
–gdoronはMonicaをサポートしています2012

1
@PeanutsMonkey。1.return無視された後、コードを持つことはできません。2.エラーや警告は表示されません。このデモをご覧ください
–gdoronはMonicaをサポートしています2012

10

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

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

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

arguments[0]
arguments[1]
arguments[2]
  • JavaScript-決定的なガイド、第5版

7

これがJavaScriptの仕組みです。パラメータはオプションであり、関数呼び出しから欠落している場合、関数内の値ではない値「undefined」が含まれます。

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

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値とまったく同じではありません。また、「未定義」自体はキーワードではありません。半特殊な変数名です!


optional「実際には価値がない」という価値だけでなく、その意味をさらに詳しく説明していただけますundefinedか?
PeanutsMonkey 2012年

@ PeanutsMonkey-変数が指定されていない場合は、になりますundefined
デレク朕會功夫

@ Pointy-宣言されたパラメータのいずれかが実際に値にバインドされるという保証がないということはどういう意味ですか?
PeanutsMonkey 2012年

1
@PeanutsMonkeyJavaScriptは動的言語です。関数を呼び出す場合、パラメーターの数を含め、関数の宣言は重要ではありません。したがって、必要な数のパラメーターを使用して関数を宣言できますが、関数が呼び出されたときに実際に渡されるパラメーターの数に制限はありません。(このように、Cのようなもので、少なくとも昔はCです。)したがって、パラメーターを宣言し、パラメーター値を指定せずに呼び出しを行うと、パラメーターはになりますundefined
とがった2012年

3

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]

ありがとう。クロスポストではなく、まだエラーが発生するので、David Thomasに提供した私の例をご覧くださいundefined
PeanutsMonkey 2012年

@PeanutsMonkey:え?あなたの問題は何ですか?
ロケット危険物2012年

それ自体は問題ありません。私は、あなたが答えに含めたより多くのパラメーターを渡すことについて、Davidへの私のフォローアップ質問を参照していました。私が完全にフォローしていないのは、あなたが何を意味するのlogsかということです。どこに記録しますか?
PeanutsMonkey 2012年

1
@PeanutsMonkey:「JavaScriptコンソール」にログを記録します。ほとんどのブラウザでは、F12またはCtrl+Shift+Jを押してアクセスできます。
ロケット危険物2012年

1
最初の文のよう古くなってES2015 ...
異端モンキー

2

関数で指定された引数よりも多くの引数を指定することもできます

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

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


@albert引数は、オブジェクトのように配列ではありません。参照
Mahi

1

関数が、渡すことになっているパラメーターを処理できることを期待するまで、エラーは発生しないためです。

例えば:

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

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


関数内のパラメーターを参照しない限り、エラーは発生しませんか?そうですか?
PeanutsMonkey 2012年

ここで、指定した例について詳しく説明しfunction myfunction(a,b) { var calc = a+b; return;}てから関数を呼び出すと、パラメーターを渡してもdocument.write(myfunction(1.2));の値が得られるのはなぜundefinedですか?
PeanutsMonkey 2012年

1
何も返さないからです。:あなたは、明示的に、あなたの例では、値を返す必要がいずれか return calc;またはreturn a+b;(;後者最後の行として、当然returnの代わりにvar calc)。
デビッドは、モニカ

つまり、宣言する場合、変数を宣言する必要がないということreturn a+b;ですか?
PeanutsMonkey 2012年

@ PeanutsMonkey-詳細はreturn こちらをご覧ください
デレク朕會功夫

0

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

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


0

javascript console.logでは、関数内では渡されないパラメーターの出力としてundefinedが提供されますが、関数内ではブラウザーが変数を明示的に宣言するため、関数外では未定義のエラーが発生します。例えば

console.log(x) 

VM1533:1 Uncaught ReferenceErrorを与えます:xは定義されていませんが、

function test(x) {
console.log(x)
}
test(); 

未定義を与えます。これは、関数test()がブラウザによって次のように書き直されているためです。

function test(x) {
    var x;
    console.log(x)
    }

もう一つの例 : -

var x =5 ;
function test(x) {
console.log(x)
}
test(); 

関数が次のようになるため、まだ未定義です

function test(x) {
    var x;
    console.log(x)
    }

以下の例のアラートは未定義を与えます:-

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

上記の関数は次のようになります:-

 function test() {
    var x;
    alert(x);
    x =10;
    }

関数内のjavascript変数のスコープは、ブロックレベルではなく、関数レベルのスコープです。例えば

function varScope() {

for(var i = 0; i < 10; i++){
    for(var j = 0; j < 5; j++){}
        console.log("j is "+j)
    }
    console.log("i is "+i);


}
varScope();

次のように出力されます:

j is 5 
i is 10

再び関数は次のようになりました:-

  function varScope() {
    var i;
    var j;
    for(i = 0; i < 10; i++){
        for(j = 0; j < 5; j++){}
            console.log("j is "+j)
        }
        console.log("i is "+i);
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.