2017-01-31 8 views
0

私は混乱しているJavaScriptのコンテキストに関する質問があります(おそらく私はJavaScript/Webdev全体を初めて知っているからです)。この関数を初期化し、これをコンテキストとして指定して実行します。その中でinput要素からkeyupイベントをサブスクライブし、このコンテキストにバインドします。しかし、関数検索は、フィルタコンテキスト内で呼び出される関数によって呼び出されても、ウィンドウ関数で呼び出されます。それはなぜそれのようなものですか?私は、関数がinvokerコンテキストで呼び出されると考えました。JavaScriptのコンテキストに関する混乱

function Filter() { 

    /** 
    * Other objects are set to this context (Filter) 
    */ 

    var search = function() { 
     /// Context here is window 
    } 

    var initialize = function() { 
     /// Context here is this (Filter) 
     this.searchBox = $("#search-box"); 
     this.searchBox.keyup((function() { 
      /// Context here is this (Filter) due to the bind() 
      var newSearch = this.searchBox.val(); 
      var previousSearch = this.filterValues.search; 

      if (newSearch !== previousSearch) { 
       if (newSearch.length === 0) 
        this.filterValues.Search = null; 
       else 
        this.filterValues.Search = newSearch; 

       clearTimeout(this.searchTimer); 
       this.searchTimer = setTimeout(search, 250); 
      } 
     }).bind(this)); 
    } 

    initialize.call(this); 
} 

使用法:

this.filter = new Filter(); 
+0

待って、私はなぜ知っていると思う!検索を呼び出すのはウィンドウ内にあるタイマーです。それはそれになっている! – Alex

+0

そうだね。あなたのコードスニペットは、 'search'が' window'の文脈にあることを意味していたようです。 –

+0

間違いなく。 JavaScript内のコンテキストを処理することは難題です。 – Alex

答えて

1

私は答えたと思う:のsetTimeoutのコンテキストがウィンドウであり、従って得て検索するので

this.searchTimer = setTimeout(search, 250); 

this.searchTimer = setTimeout(search.bind(this), 250); 

に置き換えられますウィンドウで呼び出されます。

関連する問題