我在我的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;
}
答案 0 :(得分:18)
此代码不必要地混淆。单词context
和scope
用于表示错误的内容。首先,让我向每个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”时,该单词指的是该函数正在执行的对象。