ホームページ  >  記事  >  ウェブフロントエンド  >  JS の関数の理解に関する簡単な分析

JS の関数の理解に関する簡単な分析

高洛峰
高洛峰オリジナル
2017-01-21 09:29:231136ブラウズ

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

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

Function のコンストラクターは任意の数のパラメーターを受け取ることができますが、最後のパラメーターは常に次のように扱われます。関数本体。この方法の欠点の 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;
}

上の行が sum を function(num1,num2) にポイントし、次に sum を指していることは明らかです。は function(num1, num2, num3) を指しているため、2 番目のポインターが最初のポインターを上書きします。したがって、js にはオーバーロードの概念がないことがより明らかです。

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

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

次の例に示すように、関数宣言は最も一般的な定義方法であると言えます:

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

関数式、この定義方法はクロージャや、共通の $scope.doSomething などの一部のフレームワークでよく使用されます。 in Angular = 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 はどの関数も指していないため、その前に関数を呼び出すとエラーが報告されます。

上記は編集者が紹介した JS の関数の理解 (基本) です。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。

JS の関数の理解に関するその他の記事については、PHP 中国語 Web サイトに注目してください。

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