2016-04-12 2 views
0

modを使って私の質問をより良くすることができれば、簡単に例を挙げることなくこれを尋ねるのは難しいので、私は感謝しています。ここで私が作成した関数である:あなたが見ることができるように私の変数は、なぜvar宣言の中にあるときに 'var'宣言が必要なのですか?

$("#myField").on('keyup', function(event){ 
    var input = $(this), 
     val = input.val(), 
     inputGroup = input.parents('div.input-group') 
     searchingIcon = $(inputGroup).find('i.auto-spinner'), 
     button = $(inputGroup).find('span.input-group-btn > button.btn'), 
     key = event.which, 
     typingTimer; // This throws an error typingTimer is not defined 

    //Clear typing timeout on keypress 
    clearTimeout(typingTimer); 
    //.... more code below.. not important 
    }); 

が、私は私が得る、私はtypingTimerに到達したとき、この場合には、しかし、コンマに続く1つの簡単なのvar宣言で私のVARSを宣言したいです空の変数を定義するのではなく、変数を探しているかのように、未定義のvarエラーが発生します。私が単にこれに変更する場合:

$("#myField").on('keyup', function(event){ 
    var input = $(this), 
     val = input.val(), 
     inputGroup = input.parents('div.input-group') 
     searchingIcon = $(inputGroup).find('i.auto-spinner'), 
     button = $(inputGroup).find('span.input-group-btn > button.btn'), 
     key = event.which; 
    var typingTimer; // All is well again... 

    //Clear typing timeout on keypress 
    clearTimeout(typingTimer); 
    //.... more code below.. not important 
    }); 

すべて正常に動作します。私がこの現象を経験したのはこれが初めてではありません。私は本当にその原因を知りません。 (;)で区切られていない変数を定義する方法にはいくつかの制限がありますか?

+3

'inputGroup'宣言の後にコンマがないため、その行の後にセミコロンが自動的に挿入されます。したがって、以降のすべての割り当ては宣言ではありません。それらは単に既存の変数(またはその名前の変数が存在しない場合は暗黙のグローバル変数)への代入です。私はタイプミスとしてこれを閉じるのか、他の人がこの同じタイプミスをするかもしれないので答えるかどうか分からないのですか? – apsillers

+1

_「この現象を初めて経験したわけではありません」_:おそらくあなたのヴァールを宣言する方法の変更に時間がかかるでしょうか? – Andy

+0

確かに。それは現象ではなく、間違ったコードです。 – Stuart

答えて

3

あなたの宣言の1つ後にコンマがありませんinputGroup = input.parents('div.input-group')。あなたの他の宣言もすべて式であるので(それらの後ろに=記号があります)、それらは独自の有効なステートメントです(結果をグローバル変数に代入する)。 typingTimerにはそのような割り当てがありません。そのため、未定義のエラーが発生しています。

不足しているカンマを追加すると問題が解決します。

+0

ああ、それでなければなりません。私は戻って、私の他のインスタンスをチェックする必要がありますが、それはおそらく同じことです。どこに長いvar宣言がありますか。 – Amir

1

inputGroup宣言の後にコンマがないため、その行の後ろにセミコロンが自動的に挿入されます。したがって、以降のすべての割り当ては宣言ではありません。

// declarations 
var input = $(this), 
    val = input.val(), 
    inputGroup = input.parents('div.input-group'); 

// merely assignments 
    searchingIcon = $(inputGroup).find('i.auto-spinner'), 
    button = $(inputGroup).find('span.input-group-btn > button.btn'), 
    key = event.which, 
    typingTimer; 

typingTimerはそう左の外側のいずれかの方法でそれを使用して、存在しません:彼らは私たちは、明示的、暗黙のセミコロンを記述することで、より明確にあなたのコードに問題があることを示してすることができます。..単に

アサインされています割り当ての手元側が無効です。上記の他の代入文は、暗黙のグローバルを作成するため(厳密なモードではないため)、許容されます。

inputGroupの割り当ての後にカンマを追加すると、後続の行が期待通りに宣言されます。

+0

私はあなたが 'searchingIcon'の前に' inputGroup = input.parents( 'div.input-group')、または少なくともvarを意味すると思います。 – LCIII

+0

@LCIIIコードブロックでは、問題のある例では、解決策を提示しない。明確にするために編集されました。 – apsillers

関連する問題