2016-06-13 13 views
0

JavaScriptでモジュールパターンを使用しているので、コード内のグローバル変数の数を減らすため、JavaScriptでの悪い習慣とみなされます。変数の中で関数を呼び出す方法は?

例えば、私は入力から電​​子メールを検証するために、この単純な機能を持っている:

var checkEmail = (function() { 
    var userEmail = document.getElementById('contactEmail'), 
     emailRegEx = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i; 

    function validateEmail() { 
     if (userEmail.value.search(emailRegEx) === -1) { 
      console.log('Invalid email!'); 
      return false; 
     } else { 
      console.log('Correct!'); 
     } 
    } 
    userEmail.addEventListener('keyup', validateEmail); 
})(); 

どのように私は、この関数を呼び出すことができますか?

+1

を助け、あなたはすべてのエラーを見ている、あなたが既にあなたが使用している、「どのように私は、この関数を呼び出すことができますか?」のaddEventListener – brk

+1

でそれを呼び出しているようです既にそれ自身を呼び出すIIFE(即座に呼び出された関数式)。あなたは何も返さないので、 'checkEmail'は' undefined'になります。 – A1rPun

+0

私はOPが 'validateEmail'関数を呼び出そうと思っています。最も簡単な方法は、 'userEmail'オブジェクトで' keyup'イベントをトリガーすることです。 –

答えて

3
var checkMail = function(){ ... } 

だけで使用、多かれ少なかれ同等

function checkMail(){ ... } 

ので、それを呼び出すためにです:

checkMail(); 

編集

私は速すぎたかもしれません。あなたが持っているものはクロージャーとそれの中の別の機能です。最初にvar checkEmail =がなくても機能します。それは自分自身を呼び出して、リスナーをkeyupイベントに追加するためです。あなたは、内側validateEmail機能へのアクセス権を持っていると思った場合は、これを実行する必要があります:

var checkEmail = (function() { 
    var userEmail = document.getElementById('contactEmail'), 
     emailRegEx = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i; 

    function validateEmail() { 
     if (userEmail.value.search(emailRegEx) === -1) { 
      console.log('Invalid email!'); 
      return false; 
     } else { 
      console.log('Correct!'); 
     } 
    } 
    userEmail.addEventListener('keyup', validateEmail); 

    return validateEmail; 
})(); 

あなたは関数自体を返したい、と今、あなたは、内側の関数を呼び出すためにcheckMail()を使用することができます。

+0

実際には、 'return validateEmail'だけで十分です。イベントリスナーを何度も何度も追加するのはあまり意味がありませんが、おそらく状況全体のロジックを再分析する必要があります。それに、IIAFとしてそれを宣言する私には無意味だと思われる – briosheje

+0

大きな説明をありがとう。私はよく説明しなかったかもしれない。私がしようとしていたのは、checkEmail変数の中で関数全体を使うことでした。私が見ることができるように、私はそれを呼び出す必要はありません。しかしこれは良い習慣だと思いますか? – brunodd

+1

@ brunoddこれは、クロージャと呼ばれるJavaScriptの非常に現代的なテクニックです。これは、グローバルスコープを汚染する機能固有の変数をたくさん持たないのに最適な方法です。ほとんどのjsライブラリは今日、何らかの形でそれを使用しています。そうです、それは良い習慣です。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures –

1

あなたは、具体的validateEmail関数を呼び出すことができるようにしたい場合は、あなたがそれを返すことができます:

var checkEmail = (function() { 
    var userEmail = document.getElementById('contatoEmail'), 
     emailRegEx = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i; 

    function validateEmail() { 
     if (userEmail.value.search(emailRegEx) === -1) { 
      console.log('Invalid email!'); 
      return false; 
     } else { 
      console.log('Correct!'); 
     } 
    } 
    userEmail.addEventListener('keyup', validateEmail); 

    return{ 
     validateEmail : validateEmail; 
    } 
})(); 

あなたcheckEmail変数がグローバルスコープにある場合、validateEmailが同様にグローバルスコープで利用できるようになります。

0

あなたは既にあります。この:

var checkEmail = function() { 
    var userEmail = document.getElementById('contactEmail'), 
     emailRegEx = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i; 

    function validateEmail() { 
     if (userEmail.value.search(emailRegEx) === -1) { 
      console.log('Invalid email!'); 
      return false; 
     } else { 
      console.log('Correct!'); 
     } 
    } 
    userEmail.addEventListener('keyup', validateEmail); 
}; 

checkEmail(); 

はこれと同じです:

(function() { 
    var userEmail = document.getElementById('contactEmail'), 
     emailRegEx = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i; 

    function validateEmail() { 
     if (userEmail.value.search(emailRegEx) === -1) { 
      console.log('Invalid email!'); 
      return false; 
     } else { 
      console.log('Correct!'); 
     } 
    } 
    userEmail.addEventListener('keyup', validateEmail); 
})(); 
1

var checkEmail = (function() {})();はすぐ呼び出されます匿名関数式です。すぐに呼び出される関数式(IIFE)と呼ばれます。したがって、呼び出す必要はありません!

+0

これはやや誤解を招くものです。 'checkEmail'は関数ではありません。それは 'undefined'になります。名前のない関数は、コードの記述方法(IIFEとも呼ばれます)によって呼び出されます。 –

+1

「自己呼び出し」機能は、古い、不正確な用語です。直ちに呼び出される関数式(IIFE)は、はるかに良い用語です。 –

+0

ありがとうございました! – Sun

1

モジュールパターンが表示されています。実際には、このパターンには、init、render、およびイベントバインディング関数が含まれている必要があります。正しい場合、init関数がモジュールを起動します。 また、を使用して、すべての変数をモジュールに保存して参照する必要があります。

例:

var checkEmail = (function() { 

function init(){ 

    //Store all variables on module 
    cacheDom(); 

    //Bind all user events click, keyup ect... 
    bindEvents(); 

    //Resets form , clears input fields ect...basically sets app to default state 
    render(); 

} 

function cacheDom(){ 

     this.userEmail = document.getElementById('contactEmail'), 
     this.emailRegEx = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i; 


} 

function bindEvents(){ 
this.userEmail.addEventListener('keyup', validateEmail); 

} 

//Render sets the default state of app 
function render(){ 

userEmail.innerHTML = " "; 

} 



function validateEmail() { 
    console.log('keyed') 
     if (userEmail.value.search(this.emailRegEx) === -1) { 
      console.log('Invalid email!'); 
      return false; 
     } else { 
      console.log('Correct!'); 

     //Resets state after success 
     render() 
     } 

    } 

    //Initializing module...email will be validated on keyup 
    init(); 

})(); 

希望これは

+0

ありがとうございます。うん、私はJavaScriptでModule Patternsを使い始めています。たとえば、すべての入力が空白であるかどうかをチェックする別の関数がある場合、checkEmail変数内でその関数を使用する必要がありますか? – brunodd

+1

はい電子メールフォームに関連付けられたすべてのアクションは、checkEmailモジュール内に配置する必要があります。 – KpTheConstructor