javascript - 如何在不使用 Eval 的情况下调用匿名函数?

标签 javascript callback eval anonymous-function

我有一个带有回调的自动完成函数来返回数据。这个自动完成功能被许多不同的实例使用。

$.fn.acItem = function(callback){
  var self = this;
  $(self).autocomplete({
    (...)
    select: function(e, ui){
      // Eval for calling anonymous function (right?)
      window[callback](ui.item);
    }
  });
};

我也在使用命名空间

var Agency = {
  init: function() {
    var self = this;
    self.registerAgency.addItem();
  },

  registerAgency: {
  (...)
    addItem: function(item){
      if(!item){
        (...)
        // Initiate autocomplete on input
        $('.search-item').acItem('Agency.registerAgency.addItem');
      } else {   
        // Do something with Item
      }
    }
}

Agency.init();

如果我不使用命名空间,则使用 window[callback](ui.item) 可以。但是对于命名空间,它变得有点复杂,如 described by Jason Bunting .

由于不同的命名空间正在使用 acItem(),它需要知道在回调中调用什么函数。但是许多人强烈反对使用 Eval 调用匿名函数。

那么对匿名函数进行回调的好方法是什么?

最佳答案

  1. window['foo']() 不是“eval”。它与使用不同语法的 window.foo() 相同,您可能也不会将其称为“eval”。
  2. 问题是您希望回调函数是一个专门命名的全局函数。但是您不必按名称 传递函数;函数是 Javascript 中的一流对象,可以作为值 直接传递。你实际上应该简单地接受一个函数作为回调:

    $.fn.acItem = function(callback) {
        callback();
    };
    

    此函数接受回调作为函数并调用它。非常直接。您将像这样传递回调:

     $('.search-item').acItem(function () { .. });
     // or:
     $('.search-item').acItem(this.registerAgency.addItem);
     // or, to preserve the `this` context inside the callback:
     $('.search-item').acItem(this.registerAgency.addItem.bind(this.registerAgency));
    

关于javascript - 如何在不使用 Eval 的情况下调用匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32474443/

相关文章:

python - 有没有办法为 Python 的 eval 保护字符串?

javascript - 无需访问服务器即可获取缓存数据的计数

node.js - 如何访问 Mongoose/nodejs 中回调函数中的值?

c - 在 Ruby FFI 中声明 char 数组

methods - 有什么方法可以让构建器使用创建对象的方法注册回调?

actionscript-3 - 使用 ActionScript 评估数学公式字符串

javascript - 过滤json数据并在网格中显示数据

javascript - Phonegap 3.7.0 手电筒插件不起作用

javascript - setInterval 手动设置间隔时间

javascript - 在 javascript 中替换 eval() 的正确方法是什么?