在JavaScript中将唯一属性与匿名函数关联
在创建匿名JavaScript函数时,将唯一属性关联到匿名JavaScript函数的标准方法是什么,以便在执行这些函数时(即运行时)可以在函数内部访问这些属性 一种情况是: 假设我有要绑定到动态生成的匿名函数的事件在JavaScript中将唯一属性与匿名函数关联,javascript,jquery,Javascript,Jquery,在创建匿名JavaScript函数时,将唯一属性关联到匿名JavaScript函数的标准方法是什么,以便在执行这些函数时(即运行时)可以在函数内部访问这些属性 一种情况是: 假设我有要绑定到动态生成的匿名函数的事件 var事件=['connect'、'disconnect'、'error'、'connect_failed']; 对于(事件中的a){ var handler=function(){ //console.log(arguments.callee.custom);//不可靠,因为被调用
var事件=['connect'、'disconnect'、'error'、'connect_failed'];
对于(事件中的a){
var handler=function(){
//console.log(arguments.callee.custom);//不可靠,因为被调用方可能已弃用
控制台日志(“”);
};
handler.custom=事件[a];
$(窗口).on(事件[a],处理程序);
}
因为不推荐使用参数。被调用方,并且不能保证在所有平台上都是最优的。实现类似功能的推荐方法是什么?您可以在函数中使用
处理程序。自定义:
var handler = function() {
console.log(handler.custom);
console.log('<event-name>');
};
编辑:刚刚意识到您也可以使用forEach
(尽管这也会受到浏览器兼容性问题的影响):
您也可以在函数中使用handler.custom
:
var handler = function() {
console.log(handler.custom);
console.log('<event-name>');
};
编辑:刚刚意识到您也可以使用forEach
(尽管这也会受到浏览器兼容性问题的影响):
命名函数表达式仅在函数范围内引用函数本身:
var事件=['connect','disconnect','error','connect_failed']
for(事件中的var a){
var handler=函数内部(){
console.log(inside.custom);//未弃用
控制台日志(“”);
};
handler.custom=events[a];//即使重命名或移动,现在仍将保留函数
$(窗口).on(事件[a],处理程序);
}
但是,Internet Explorer 8及以下版本无法正确解析命名函数-Juriy Zaytsev更详细地解释了它们背后的确切问题:
如果您真的必须针对IE8及以下版本,请坚持使用arguments.callee或使用IE的条件编译,这基本上是针对JavaScript的IE条件注释。命名函数表达式仅在函数范围内引用函数本身:
var事件=['connect','disconnect','error','connect_failed']
for(事件中的var a){
var handler=函数内部(){
console.log(inside.custom);//未弃用
控制台日志(“”);
};
handler.custom=events[a];//即使重命名或移动,现在仍将保留函数
$(窗口).on(事件[a],处理程序);
}
但是,Internet Explorer 8及以下版本无法正确解析命名函数-Juriy Zaytsev更详细地解释了它们背后的确切问题:
如果你真的要针对IE8及以下版本,要么坚持使用arguments.callee,要么对IE使用条件编译,这基本上就是针对JavaScript的IE条件注释。我知道你的意思。。。
您想知道触发事件时的事件名称,并想知道在函数的运行时触发了哪个事件。。。我说得对吗?然后您可以使用处理程序中接收的事件对象。。。
var events = ['connect','disconnect','error','connect_failed'];
for(a in events){
var handler = function(e){
console.log(e.type);
console.log('<event-name>');
};
$(window).on(events[a],handler);
}
for(a in events){
$(window).trigger(events[a]);
}
var事件=['connect'、'disconnect'、'error'、'connect_failed'];
对于(事件中的a){
变量处理程序=函数(e){
console.log(e.type);
控制台日志(“”);
};
$(窗口).on(事件[a],处理程序);
}
对于(事件中的a){
$(窗口).trigger(事件[a]);
}
我知道你的意思。。。
您想知道触发事件时的事件名称,并想知道在函数的运行时触发了哪个事件。。。我说得对吗?然后您可以使用处理程序中接收的事件对象。。。
var events = ['connect','disconnect','error','connect_failed'];
for(a in events){
var handler = function(e){
console.log(e.type);
console.log('<event-name>');
};
$(window).on(events[a],handler);
}
for(a in events){
$(window).trigger(events[a]);
}
var事件=['connect'、'disconnect'、'error'、'connect_failed'];
对于(事件中的a){
变量处理程序=函数(e){
console.log(e.type);
控制台日志(“”);
};
$(窗口).on(事件[a],处理程序);
}
对于(事件中的a){
$(窗口).trigger(事件[a]);
}
您可以这样做:
var events = ['connect','disconnect','error','connect_failed'];
function assignHandler(eventType, custom) {
$(window).on(events[a], function() {
console.log(custom);
});
}
for(a in events){
assignHandler(events[a], events[a]);
}
JS闭包的神奇之处在于,即使在assignHandler()
完成之后,作为assignHandler()
内部事件处理程序指定的匿名函数也能够访问assignHandler()
的自定义
参数
但是,由于您似乎正在使用jQuery,您不需要自己实现任何东西,因为jQuery已经具备了这方面的功能:
.on( events [, selector ] [, data ], handler(eventObject) )
注意可选的第三个参数是数据
。在事件处理程序中,可以通过以下方式访问该事件
用于(事件中的a){
变量处理程序=函数(e){
控制台日志(如数据);
控制台日志(“”);
};
var custom=事件[a];
$(窗口).on(事件[a],null,自定义,处理程序);
}
您可以这样做:
var events = ['connect','disconnect','error','connect_failed'];
function assignHandler(eventType, custom) {
$(window).on(events[a], function() {
console.log(custom);
});
}
for(a in events){
assignHandler(events[a], events[a]);
}
JS闭包的神奇之处在于,即使在assignHandler()
完成之后,作为assignHandler()
内部事件处理程序指定的匿名函数也能够访问assignHandler()
的自定义
参数
但是,由于您似乎正在使用jQuery,您不需要自己实现任何东西,因为jQuery已经具备了这方面的功能:
.on( events [, selector ] [, data ], handler(eventObject) )
注意可选的第三个参数是数据
。在事件处理程序中,可以通过以下方式访问该事件
用于(事件中的a){
变量处理程序=函数(e){
控制台日志(如数据);
控制台日志(“”);
};
var custom=事件[a];
$(窗口).on(事件[a],null,自定义,处理程序);
}
我特别喜欢closure中的作用域处理程序我特别喜欢closure中的作用域处理程序+1用于使用命名函数表达式,非常优雅的解决方案IMO.+1用于使用命名函数表达式,非常优雅的解决方案IMO。
for(a in events){
var handler = function(e){
console.log(e.data);
console.log('<event-name>');
};
var custom = events[a];
$(window).on(events[a], null, custom, handler);
}