Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中将唯一属性与匿名函数关联_Javascript_Jquery - Fatal编程技术网

在JavaScript中将唯一属性与匿名函数关联

在JavaScript中将唯一属性与匿名函数关联,javascript,jquery,Javascript,Jquery,在创建匿名JavaScript函数时,将唯一属性关联到匿名JavaScript函数的标准方法是什么,以便在执行这些函数时(即运行时)可以在函数内部访问这些属性 一种情况是: 假设我有要绑定到动态生成的匿名函数的事件 var事件=['connect'、'disconnect'、'error'、'connect_failed']; 对于(事件中的a){ var handler=function(){ //console.log(arguments.callee.custom);//不可靠,因为被调用

在创建匿名JavaScript函数时,将唯一属性关联到匿名JavaScript函数的标准方法是什么,以便在执行这些函数时(即运行时)可以在函数内部访问这些属性

一种情况是:

假设我有要绑定到动态生成的匿名函数的事件

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);
}