0

我遇到了一些 javascript 或 jQuery 函数,它们在方法的末尾有一个封闭的值或对象。例子:

(function ($) {
        var delay = 0;
        $.fn.translate3d = function (translations, speed, easing, complete) {
            var opt = $.speed(speed, easing, complete);
            opt.easing = opt.easing || 'ease';
            translations = $.extend({ x: 0, y: 0, z: 0 }, translations);

            return this.each(function () {
                var $this = $(this);

                $this.css({
                    transitionDuration: opt.duration + 'ms',
                    transitionTimingFunction: opt.easing,
                    transform: 'translate3d(' + translations.x + 'px, ' + translations.y + 'px, ' + translations.z + 'px)'
                });

                setTimeout(function () {
                    $this.css({
                        transitionDuration: '0s',
                        transitionTimingFunction: 'ease'
                    });

                    opt.complete();
                }, opt.duration + (delay || 0));
            });
        };
    })(jQuery);

或者

<script type="text/javascript">
    (function (d, t) {

<snip>

    })(document, 'script');
</script>

函数末尾的括号括起来的项目的目的是什么?我在 SO 上找到了几个答案,但没有任何解决办法。谢谢

4

2 回答 2

3

它定义了一个带有参数的匿名函数,将值分配给函数的参数,然后调用它。

这种方法的优点是你不会用函数和变量污染你的命名空间,这些函数和变量除了函数内部之外不会在其他任何地方使用。

更详细地说,

(function() {} ...声明匿名函数并()在最后添加调用刚刚创建的函数。

于 2013-09-04T23:31:27.357 回答
2

它形成了一个自调用匿名函数。优点是所有标识符都被限定在该函数内,而不是具有全局范围。

这是一个很好的链接,可以详细介绍:http: //markdalgleish.com/2011/03/self-executing-anonymous-functions/

这是一个例子:

(function() {
  var foo = "bar";

  console.log(foo); // prints bar
})();

console.log(foo);  // prints undefined since foo is scoped within the function

像这样重写时,上面的代码片段可能更容易理解:

function fun() {
  var foo = "bar";
  console.log(foo);
}

fun();

这两个代码片段实现了相同的目的。唯一的区别是,在他的第一个片段中,你没有命名你的函数然后调用它。相反,您将其创建为匿名函数,并立即调用它。

当您想要将对象绑定到某个变量时,这也很有用,例如jQuery在您的代码片段中完成:

var $ = {}; // define $ to an empty object instead of the jQuery object

(function($) {
  // within this function, $ will always be the jQuery object
  // protecting you from re-definitions outside the funciton
  console.log($);
})(jQuery);

上面的代码片段创建了一个匿名函数,它接受一个参数,$然后立即调用传入jQuery对象的函数,确保函数$内始终引用该jQuery对象。

自调用匿名函数的另一个有趣应用是当您想将变量绑定到特定对象以防延迟执行。

var markers = []; //an array of google map markers

for(var i = 0; i < markers.length; i++) {
  // do something with markers[i];

  // then schedule it for removal after 2 seconds
  setTimeout(function() { markers[i].setMap(null); }, 2000);
}

上述代码片段的问题在于,当标记删除代码在 2 秒后运行时,i由于循环继续进行,到那时 的值会发生变化。这可以通过使用自调用匿名函数创建闭包来解决:

for(var i = 0; i < markers.length; i++) {
  // do something with markers[i];

  // then schedule it for removal after 2 seconds
  (function(j) {
    setTimeout(function() { markers[j].setMap(null); }, 2000);
  })(i);

}

现在,j绑定到 的当前值i,因此当删除代码在 2 秒后运行时,它会在 的预期值上运行i,即使i此后已经更改。

于 2013-09-04T23:31:26.873 回答