2016-05-18 4 views
2

この例ではjQueryを使用していますが、これは答えには関係ありません。コードの繰り返しを避ける関数に関数をラップする方法

私は、ページの読み込みに火二つの事象があります。

triggerEvent(SNVisitsForm); 
$('#email').blur(triggerEvent(SNEnterEmail)); 

最初は単純にユーザーがページを訪れたときに発射し、他のユーザーが電子メールのフィールドをぼかしたときに発動するリスナーです。

triggerEventは、1つの単純な条件付きで多くの異なる関数を「ラップ」するために使用する関数です。目標は、この条件を付けることができ、ラップに任意の機能を持つことである:この関数は、以来、triggerEvent(SNVisitsForm);機能完璧)

しかし(つまり(、2つの例の最初のためだけで正常に動作し

function triggerEvent(wrapped_function) { 
if (typeof _cookie !== 'undefined') { 
     wrapped_function(); 
     console.log('Doing the event, because the cookie is defined'); 
    } 
} 

このようなSNEnterEmail開始:

function SNEnterEmail(event) { 
    var email = event.target.value; 

私はラップ関数にラッパー関数を介してイベントを渡す必要がありますあなたが見ることができるように、時々イベントは(2の最初の場合のように存在していません。例)

もっと「javascript」の方法がありますか?確かに答えは、「条件付きコードを必要とするすべての呼び出しの周りに置く」または「それを必要とするすべての単一の関数に入れる」ではありません。この繰り返しを避けるためにjavascriptで承認された方法は何ですか?

編集:私の答えは、関数内の関数をラップすることとまったく異なるものかもしれないと付け加えておきます。それは私が何をしようとしているかを説明するために考えることができる最良の方法でした。私はよく分からない

if (window.location.pathname == '/') { 
    (triggerEvent(SNVisitsForm)()); 
} 
$('#email').blur(triggerEvent(SNEnterEmail)); 

:私は利用エイドリアンのラッパー関数をした、そして私の呼び出しへの迅速な修正はすべての作品を作った

:どのように受け入れられた答えは私のためにこれを解決し

なぜadrianがラップされた関数をvarsに変更したのか、それらを関数として残しました。次に、ラッパー関数(すなわち、リスナーにバインドされていないもの)の「標準」呼び出しをただちに呼び出す。

+0

$( '#email')。blur(triggerEvent(SNEnterEmail)); 'は何ですか? (Be * super * specific and accurate) – Amit

+0

@Amit:行は '#email'で選択された要素のblurイベントにリスナーをバインドすると思います。その要素に対してblurイベントが発生すると、 'triggerEvent'という関数がパラメータSNEnterEmailで呼び出されます。その関数は条件付きをチェックし、条件が真ならば 'SNEnterEmail'が呼び出されます。 もう少し専門用語で言えば、ユーザーがメールフィールドをクリックすると、Cookieが有効になっていることを確認し、関連するイベントがあればそれを行います。 – fildred13

+1

まあ、ちょうど私が疑ったように...あなたはその部分を間違っています...この行は何ですか(順番に):1. 'triggerEvent'を呼び出し、' SNEnterEmail'をパラメータとして渡します。 2。その呼び出しが**関数**として返されたものをblurイベントにバインドしようとしますが、明示的な戻りはなく、 'undefined'になります。何も実際にはぼかしにバインドされていませんが、 – Amit

答えて

2

関数を返す関数デコレータを作成するだけです。閉鎖は残りを気にします。

function triggerEventWrapper(wrapped_function) { 
return function(){ 
    if (typeof _cookie !== 'undefined') { 
     console.log('Doing the event, because the cookie is defined'); 
     return wrapped_function.apply(this,arguments); 
    } 
} 
} 


var SNEnterEmail = triggerEventWrapper(function(){ 
    ...... the function decloration 
}); 
$('#email').blur(SNEnterEmail); 


var SNVisitsFormWrapped = triggerEventWrapper(SNVisitsForm); 
SNVisitsFormWrapped(); 
+0

は閉まっていますが、シガーはありません。最初の行( 'triggerEvent(SNVisitsForm);')は動作しません – Amit

+0

私はその使用法を追加しました。それは助けるべきである。 – adrianj98

+0

いいえ...そうではありません。あなたは質問と私のコメントに注意を払っていません – Amit

関連する問題