ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 関数リテラルと Function() コンストラクターの違いの詳細な例

JavaScript 関数リテラルと Function() コンストラクターの違いの詳細な例

伊谢尔伦
伊谢尔伦オリジナル
2017-07-27 16:58:522304ブラウズ

関数リテラルと Function() コンストラクターの違い
関数リテラルは匿名関数ですが、構文では再帰関数を作成するときに Function() コンストラクターを使用して任意の関数名を指定できます。いいえ。

var f = function fact(x) { 
if (x < = 1) return 1; 
else return x*fact(x-1);
};

Function() コンストラクターを使用すると、Javascript コードを動的に作成し、実行時にコンパイルできます。この点では、グローバル関数 eval() に似ています。

Function() コンストラクターは関数本体を解析し、実行されるたびに新しい関数オブジェクトを作成します。したがって、ループ内で Function() コンストラクターを呼び出したり、頻繁に実行される関数を呼び出したりする効率は非常に低くなります。対照的に、関数リテラルは、検出されるたびに再コンパイルされません。

Function() コンストラクターを使用して関数を作成する場合、それは常にトップレベル関数として実行されます。

var y = "global"; 
function constructFunction() { 
var y = "local"; 
return new Function("return y"); // 无法获取局部变量} 
alert(constructFunction()()); // 输出 "global" 函数直接量:

式の構文である限り、スクリプト ホストは関数を直接関数とみなし、関数を式に記述します。四則演算の場合、ホストは次のようにそれを直接量として扱います:

var a = 10 + function(){ 
return 5; 
}();
(function(){ 
alert(1); 
} ) ( ); 
( function(){ 
alert(2); 
} ( ) ); 
void function(){ 
alert(3); 
}() 
0, function(){ 
alert(4); 
}(); 
-function(){ 
alert(5); 
}(); 
+function(){ 
alert(6); 
}(); 
!function(){ 
alert(7); 
}(); 
~function(){ 
alert(8); 
}(); 
typeof function(){ 
alert(9); 
}();

js で関数を定義する方法はたくさんありますが、関数直接量もその 1 つです。たとえば、var fun = function(){} の場合、function が fun に割り当てられていない場合、それは匿名関数になります。

匿名関数がどのように呼び出されるかを見てください。

1. 実行後に戻り値を取得する関数呼び出し

//方式一,调用函数,得到返回值。强制运算符使函数调用执行 
(function(x,y){ 
alert(x+y); 
return x+y; 
}(3,4)); 
//方式二,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行 
(function(x,y){ 
alert(x+y); 
return x+y; 
})(3,4);

2. 実行後の戻り値を無視する

//方式三,调用函数,忽略返回值 
void function(x) { 
x = x-1; 
alert(x); 
}(9);

さて、最後に間違った呼び出しメソッドを見てみましょう

//错误的调用方式 
function(x,y){ 
alert(x+y); 
return x+y; 
}(3,4);

以上がJavaScript 関数リテラルと Function() コンストラクターの違いの詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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