代码之家  ›  专栏  ›  技术社区  ›  Uzi

将动态参数传递给IIFE

  •  3
  • Uzi  · 技术社区  · 9 年前

    我遇到了将变量传递给IFFE的问题。读了一些书,还是没弄明白。非常感谢您的指导。

    • 我有一个单击事件处理程序函数,它从 单击DOM时。
    • 我需要把身份证交给一个IIFE
    • IFFE需要从阵列中添加/删除该ID, 这取决于它是否已经存在。

    这就是我得到的:

    事件:

    $(document).on('click', 'input[type="checkbox"]', check);
    

    单击处理程序:

    function check() {
        var id = $(this).closest('ul').attr('data-id');
        return id;
    }
    

    生活:

    var checkID = (function (val) {
    
        var arr = [];
    
        return function () {
    
            var i = arr.indexOf(val);
    
            if (i === -1) {
                arr.push(val);
            } else {
    
                arr.splice(i, 1);
            }
            return arr;
        }
    
    })(id);
    

    现在我拿到了身份证,但却一无所获。

    在我的IIFE中,我确实通过了 id 变量,但未定义。

    那么,我如何通过 ID 变量im从 check() checkID 生活?

    也欢迎其他解决方案。

    谢谢

    3 回复  |  直到 9 年前
        1
  •  2
  •   user5325596    9 年前

    在您的clickHandler中

    function check() {
        var id = $(this).closest('ul').attr('data-id');
        checkID(id);
    }
    

    和改变 checkID

    var checkID = (function () {
    
        var arr = [];
    
        return function (val) {
    
            var i = arr.indexOf(val);
    
            if (i === -1) {
                arr.push(val);
            } else {
    
                arr.splice(i, 1);
            }
            return arr;
        }
    
    })();
    
        2
  •  1
  •   Jamiec    9 年前

    我认为你们需要用另一种方式来做事。你的 check 函数将返回事件处理程序使用的函数,但它也将在单击处理程序运行后调用回调,传递数组。

    这个 检查 函数看起来像是两个函数的混搭:

    function check(callback){
      var arr = [];
      return function(){
        var id = $(this).closest('ul').attr('data-id');
        var i = arr.indexOf(id);
    
        if (i === -1) {
            arr.push(id);
        } else {
    
            arr.splice(i, 1);
        }
        callback(arr);
      }
    }
    

    如您所见,它将回调函数作为参数,该函数将在每次执行时调用,传递当前数组 arr 。例如,这是我的测试回调:

    function handler(arr){
     alert("Array has " + arr.length + " elements");
    }
    

    最后,您的事件处理程序如下所示:

    $(document).on('click', 'input[type="checkbox"]', check(handler));
    

    现场示例: https://jsfiddle.net/src282d6/

        3
  •  0
  •   Robin    3 年前

    在IIFE函数中使用getter/setter类函数可以使其更有组织性和可读性。然后,使用这些函数在IIFE函数中传递、存储和读取数据。

    var checkID = (function () {
        // your array
        var arr = [];
        // public
        return { 
          // get
          getArray: function(){
            return arr;
          },
          // set value
          setArray: function(val) {
            var i = arr.indexOf(val);
            if (i === -1) {
              arr.push(val);
            } else {
              arr.splice(i, 1);
            }
          }
        }
    })();
    

    使用方法如下:

    checkID.getArray(); // returns default empty array []
    checkID.setArray('car1');
    checkID.setArray('car2');
    checkID.setArray('car3');
    checkID.setArray('car4');
    checkID.setArray('car4'); // test splice()
    checkID.getArray(); // returns ["car1", "car2", "car3"]