此Javascript代码中的“范围”和“上下文”不同

时间:2013-01-14 16:59:19

标签: 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;
}

2 个答案:

答案 0 :(得分:18)

此代码不必要地混淆。单词contextscope用于表示错误的内容。首先,让我向每个JavaScript开发人员解释它们应该意味着什么:

函数的 context 是该函数的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);

出现了许多强大的编程模式。函数绑定(下划线bind或jQuery proxy)就是一个例子。

另一方面,

范围定义了JavaScript在运行时解析变量的方式。 JavaScript中只有两个范围 - 全局和函数范围。此外,它还涉及一种称为“范围链”的东西,使封闭成为可能。


您的on方法会保存变量scope,然后在trigger函数中将其用作上下文,这会造成混淆(不应将其命名为scope - 这是上下文):

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

我不知道上述电话中this是什么。

on方法也接受context,如果scope是假的,则默认为提供的context。然后,此context用于过滤要在trigger中调用的函数。

context !== handler.context

这使您可以通过将处理程序与任意对象(它们称为context)相关联来对您的处理程序进行分组,然后通过指定context来调用整个组。

同样,我认为这段代码过于复杂,本来可以用更简单的方式编写。但是,您首先不需要编写自己的事件发射器 - 每个库都准备好供您使用。

答案 1 :(得分:4)

范围与变量的可见性有关,而context指的是执行函数的对象。

范围:在JavaScript中,范围是通过使用函数实现的。当您在函数内部使用关键字“var”时,您正在初始化的变量是私有的,并且在该函数之外无法看到。但是,如果这个函数里面有函数,那么那些“内​​部”函数可以“看到”那个变量;该变量据说是“范围内”。函数可以“查看”在其中声明的变量。它们也可以“看到”在它们之外声明的任何声明,但不能“看到”嵌套在该函数中的函数内部声明的声明。这是JavaScript中的范围。

上下文:它指的是执行函数的对象。当您使用JavaScript关键字“this”时,该单词指的是该函数正在执行的对象。