ホームページ >ウェブフロントエンド >jsチュートリアル >javascript_javascript スキルの匿名関数を使用して、いくつかのシンプルで興味深いコード部分を分析します。

javascript_javascript スキルの匿名関数を使用して、いくつかのシンプルで興味深いコード部分を分析します。

WBOY
WBOYオリジナル
2016-05-16 18:24:26876ブラウズ

1. カプセル化呼び出しの単純な形式

コードをコピー コードは次のとおりです:

var userName = function( ) { return "jeff wong" } ();
alert(userName);


上記のコードは、次のように徐々に分解できます。書き込み:
コードをコピー コードは次のとおりです。

var anonymousFunc = function() { return "jeff wong" }; // 匿名関数
var name = anonymousFunc(); // この関数を実行して人の名前を返します


2. 新しい関数 (大文字の Function) の形式です

コードをコピーします コードは次のとおりです:
var a = new Object();
var b = new Function();
//alert(typeof (a)); //object
//alert( b)); //関数
alert(a); //[オブジェクト オブジェクト]
alert(b); //匿名関数
//alert(a == b); 🎜>//alert(a === b); //false



ご覧のとおり、変数 a がポップアップします。 ] と新しい関数 (大文字の関数であることに注意してください)、b が表示されると、匿名関数が生成されます。 b は匿名関数であるため、関数はもちろん実行できます。次のコードを試して推測を検証します。


コードをコピー コードは次のとおりです: alert(b()); //未定義
alert(a()); //スクリプト エラー プロンプト「関数が見つかりません」




3. 新しい関数は違いを生むことができます (小文字関数)
(1)、単純な空の関数



コードをコピーします コードは次のとおりです。 var func = new function() { }
alert(typeof (func));
alert(func); //[object Object]
//alert(func()); //スクリプト エラー func は関数ではありません




実際、上記のコードは次の記述メソッドと同等です:



コードをコピー コードは次のとおりです: function anonymousClass() { } //匿名クラス
var instance = new anonymousClass();
alert(typeof (instance));//object
alert(instance); [object Object]

[code]

(2) この関数には、
[code]
var func = new という戻り値があります。 function() { return "ジェフ ウォン" };
alert( typeof (func))
//alert(func()); >



実際、上記のコードは次の記述と同等です:



コードをコピー
コードは次のとおりです。 function anonymousClass () { return "jeff wong" } //Anonymous classvar instance = new anonymousClass(); (typeof (instance));//object alert(instance); //[ object Object]


(3)、関数には戻り値がまだあります。メソッドが少し異なります

次のコードと (2) の違いに注意してください。次に注目したいのは、少し異なる記述形式であるためです。



コードをコピー


上記のコードと同等の形式は依然として単純です:




コードをコピー


コードは次のとおりです。

実行して結果を見ましたか?そうです、3 番目の書き方では、func またはインスタンスをポップアップすると、予期せず「jeff wong」という文字列が得られます。 (2)と(3)のコードをよく比較すると、returnの書き方が少し違う以外はほぼ同じなので、関数を作っているのはnew Stringの形式であることは間違いないと推測します。予期せぬ効果を生み出します。 なぜこのようなことが起こっているのでしょうか?

JavaScript では、新しい式の後のコンストラクターがプリミティブ型を返す (return) 限り、(リターンがない場合は、実際には (1) などの未定義のプリミティブ型を返します) ことがわかります。 (2) メソッドの書き込みの場合、new によって作成された匿名オブジェクトが返され、new 式の後のコンストラクターがオブジェクト (Object)、関数 (function)、配列 (Array) などの参照オブジェクトを返します。 ) などの場合、返される参照オブジェクトは、new によって作成された匿名オブジェクトを上書きします。ここで、(3) の記述を分析してみましょう。 new String は文字列参照オブジェクトを構築するため、new によって作成された匿名オブジェクトが対象となり、new String が指す参照値は「jeff wong」であるため、ポップアップは次のようになります。現在の新しい文字列によって割り当てられる値です。

最後に、次のコードが何を返すかを見てみましょう:

コードをコピー コードは次のとおりです:

var func = new function() { var str = new String("jeff wong") };//別の方法で記述します
//alert(typeof (func)); //オブジェクトは期待されています
alert(func); //ここでの結果はどうなるでしょうか?

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