ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptの関数定義と宣言と式の違いを詳しく解説

JavaScriptの関数定義と宣言と式の違いを詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-21 13:48:461593ブラウズ

js では、関数は実際にはオブジェクトであり、各関数は Function 型のインスタンスであり、他の参照型と同じプロパティとメソッドを持ちます。 したがって、関数名は実際には関数オブジェクトへのポインターであり、特定の関数にバインドされません。 2 つの一般的な定義方法 (下記を参照) に加えて、この概念をより直観的に反映できる別の定義方法があります:


var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐

関数のコンストラクターは任意の数のパラメーターを受け取ることができますが、最後の 1 つのパラメーターが常に考慮されます関数本体。この方法の欠点の 1 つは、コードが 2 回解析されることです。1 回目は基本的な ES コードを解析し、2 回目はコンストラクターに渡される文字列を解析することになるため、パフォーマンスが低下します。 . ここに書いてください。 js の関数が実際にはオブジェクトであるという概念を理解するのに役立ちます。

(1) js 関数にはオーバーロードの概念はありません

オーバーロードの概念に関しては、Java でのオーバーロードの実装方法と比較してみましょう: Java では、メソッドはそのメソッドを通じてメソッドを一意に識別しますサイン。 。メソッド シグネチャには、メソッド名、パラメータの数、パラメータの順序、パラメータのタイプが含まれます。したがって、2 つのメソッドのメソッド名が同じでも、他のシグネチャ要素が異なる場合、コンパイラーはそれらを 2 つの異なるメソッドとみなし、オーバーロードの概念を実現するために同じ名前の異なるメソッドが存在できるようにします。 (引用: js にオーバーロードがない理由を深く理解する方法 -segmentfault での manxisuo の回答)。

上で述べたように、jsの関数名は実際には関数オブジェクトへのポインタであるため、関数名は関数の一意の識別子であると言え、パラメータリストとは何の関係もありません。同じ名前の 2 つの名前は使用できません (ポインターは同時に 1 つのオブジェクトしか指すことができないため) にはオーバーロードの概念がありません。 例:


function sum(num1, num2){
return num1 + num2;
}
function sum(num1, num2, num3){
return num1 + num2 + num3;
}

上記は、より直観的な別の方法で書くこともできます:


var sum = function(num1, num2){
return num1 + num2;
}
sum = function(num1, num2, num3){
return num1 + num2 + num3;
}

上記の行は、合計が function(num1,num2) を指すことは明らかです。つまり、js にはオーバーロードの概念がないことがより明白になります。

(2) 関数宣言と関数式の違い

関数を定義するには、関数宣言と関数式という 2 つの一般的に使用される方法があることがわかっています。次の例に示すように、

関数宣言は最も一般的な定義方法であると言えます:


function sum(num1, num2){
return num1 + num2;
}

関数式、この定義方法は、クロージャや、一般的な $scope などの一部のフレームワークでよく使用されます。 angular.doSomething = function(){...}:


sum = function(num1, num2){
return num1 + num2;
};

上記の 2 つの定義方法はほぼ同じですが、小さな違いがあります。次の例を参照してください:


//函数声明
alert(sum(100, 100));
function sum(num1, num2){
return num1 + num2;
}
//函数表达式
alert(sum(100, 100));
var sum = function(num1, num2){
return num1 + num2;
};

これら 2 つのコード スニペットは、関数の定義方法が異なるだけで、それほど違いはありません。しかし実際には、最初の段落は正常に動作しますが、2 番目の段落ではエラーがスローされます。これは、コードの実行が開始される前に、パーサーが関数宣言ホイスティングと呼ばれるプロセスを通じて、関数宣言をすでに読み取って実行環境に追加しているためです。簡単に言えば、パーサーはまず関数宣言をソース ツリーの最上部に配置します。以下のコードでは、関数は初期化ステートメント内にあります (先頭に引き上げられていません)。簡単に言えば、この代入ステートメントを実行する前に sum はどの関数も指していないため、その前に関数を呼び出すとエラーが報告されます。

以上がJavaScriptの関数定義と宣言と式の違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。