2013-01-14 16 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”时,这个单词指的是函数执行的对象。

相关问题