0

我有一个自定义绑定处理程序,想将其修改为 IIFE。我一直在互联网上阅读有关 IIFE 的信息,但无法将我的自定义句柄更改为 IIFE。那么如何将以下绑定处理程序更改为 IIFE

define(['knockout', 'jquery'], function(ko, $) {
    ko.bindingHandlers.er = {
        init: function(el, va) {
            console.log($(el).find('.n').text());
            $(el).find('.edit').hide().end().find('.detail').show();
            $(el).find('.ebtn').on('click', function() {
                $(el).find('.edit, .detail').toggle();
            });
            $(el).find('.ubtn').on('click', function() {
                $(el).find('.edit, .detail').toggle();
            });
        }
    };
});
4

1 回答 1

1

很不清楚你在这里问什么:(。
立即调用函数表达式(IIFE)是一个立即执行的匿名函数。在你的情况下,如果你不能更具体,真的很难猜到你想要什么放置 iife。
我通常将整个代码放入 iife 中,以利用函数范围并将其用作闭包,从而最大限度地减少全局对象污染,它通常如下所示:

(function(global,undefined){
    // the code goes here
    // global === window
})(this);

在您的情况下,您可以执行相同的操作:

 (function(global,undefined){
    define(['knockout','jquery'],function(ko,$){
        // ...
    });
})(this);

更新:
这里有一些解释给那些需要它们的人。使用以下模式:

  • 防止全局变量泄漏,例如var foo = bar;(之后window.foo === foo
  • 以防止该undefined值被覆盖。假设您要检查是否有未定义的内容。你有两种方法可以做到:
    • typeof foo === 'undefined'
    • foo === undefined
      第二个较短,但通常不受欢迎,因为可以简单地覆盖undefined变量的值:undefined = 13;
      通过不为 iife 中的参数提供实际值undefined,您实际上是将undefined变量重置为未定义。
  • 泛化全局对象
    • 有人说访问global变量比访问window对象更快,因为 js 引擎首先查看较低的范围
    • 如果您在与浏览器不同的环境中运行代码并且您调用了该window对象,您的代码可能会中断,因为全局对象因环境而异(adobe pdfs、node js、rhino ...)。这可以通过将全局对象重新映射到一个变量(在我们的例子中)来解决,方法是将它从全局范围内global引用到对象this
于 2012-07-15T16:30:57.470 回答