2013-01-14 36 views
0

我在我的Javascript代碼中使用這個基本事件系統,並且正在嘗試爲我的同事記錄它。我不確定這段代碼中的「範圍」和「上下文」有什麼區別。任何人都可以幫助我理解爲什麼我甚至需要它們兩個?在此Javascript代碼中的「範圍」和「上下文」中有所不同

this.myClass.prototype.on = function (type, method, scope, context) { 
    var listeners, handlers, scope; 
    if (!(listeners = this.listeners)) { 
     listeners = this.listeners = {}; 
    } 

    if (!(handlers = listeners[type])) { 
     handlers = listeners[type] = []; 
    } 

    scope = (scope ? scope : window); 
    handlers.push({ 
     method: method, 
     scope: scope, 
     context: (context ? context : scope) 
    }); 
} 

this.myClass.prototype.trigger = function(type, data, context) { 
    var listeners, handlers, i, n, handler, scope; 
    if (!(listeners = this.listeners)) { 
     return; 
    } 
    if (!(handlers = listeners[type])){ 
     return; 
    } 
    for (i = 0, n = handlers.length; i < n; i++){ 
     handler = handlers[i]; 
     if (context && context !== handler.context) continue; 
     if (handler.method.call(
      handler.scope, this, type, data 
     )===false) { 
      return false; 
     } 
    } 
    return true; 
} 

回答

14

此代碼不必要的混淆。用詞contextscope意味着錯誤的東西。首先,讓我解釋什麼,他們應該是指每一個JavaScript開發:

一個上下文功能的this該功能的價值 - 即對象的函數稱爲方法。

function F() { this.doSomething('good'); } 

您可以調用在不同環境下此功能是這樣的:

obj1 = { doSomething: function(x) { console.log(x); } } 

obj2 = { doSomething: function(x) { alert(x); } } 

F.call(obj1); 
F.call(obj2); 

有跡象表明,涌現出許多這樣的強大的編程模式。函數綁定(Underscore bind或jQuery proxy)就是一個例子。

範圍另一方面定義了JavaScript在運行時解析變量的方式。 JavaScript中只有兩個範圍 - 全局和功能範圍。此外,它還處理所謂的「範圍鏈」,這使得可能關閉。


on方法保存的變量scope,然後在trigger功能方面,它是混淆使用它(它不應該被命名爲scope - 它的上下文中):

handler.method.call(
    handler.scope, this, type, data 
) 

我不知道this是在上面的調用中。

on方法也接受context,如果context是虛假的,則默認爲提供的scope。然後使用此context過濾要在trigger中調用的函數。

context !== handler.context 

這讓你組的處理程序通過與任意對象(他們呼籲context),然後通過剛剛指定context調用整個組關聯。

同樣,我認爲這段代碼過於複雜,本來可以用更簡單的方式編寫。但是,你不應該首先編寫你自己的事件發射器 - 每個庫都準備好供你使用。

+0

所以基本上,範圍是沒有意義的,就像我想的那樣。我希望我能記住我在哪裏找到這個代碼。 –

+3

對於ES6中的'let'和'const',現在有一個塊範圍很好。有人請糾正我,如果我錯了。 – khizar

0

範圍屬於變量的可見性,上下文指的是執行函數的對象。

範圍:在JavaScript中,範圍是通過使用函數實現的。當你在函數中使用關鍵字「var」時,你正在初始化的變量是私有的,並且在該函數之外是看不到的。但是,如果函數內部有函數,那麼這些「內部」函數就可以「看到」該變量;該變量被認爲是「範圍內」。函數可以「看到」在其中聲明的變量。他們還可以「看到」任何在其外部聲明的內容,但決不會在嵌套在該函數中的函數內聲明。這是JavaScript中的範圍。

上下文:它指的是執行函數的對象。當你使用JavaScript關鍵字「this」時,這個單詞指的是函數執行的對象。

相關問題