Javascript:在匿名函数中包装代码

时间:2016-12-16 16:35:49

标签: javascript

如果我将脚本包装在匿名样式函数中,就像在Coffeescript中编译适合操作DOM一样?

  • 它有什么好处?
  • 这有什么问题?
  • 我的代码更安全吗?
(function() {

this.detect = function(){
  window.alert( "message" );

};

}).call(this);

2 个答案:

答案 0 :(得分:3)

完全合适。这通常被称为IIFE

好处是:

  • 您可以通过“在命名空间下工作”来避免变量命名冲突 - 命名变量和设置范围:

    (function ($, DOM, ultraSelector) {
    
         $(DOM).find(ultraSelector); // $ is always jQuery
    
    })(jQuery, document, 'mySelector');
    
    $ = false; // here $ is not jQuery anymore
    
  • 您的变量在您的范围内保持管理,绝不可全球访问;以及

  • 您可以'use strict'安全地知道只有IIFE内的代码会受到影响:

    (function () {
    
         'use strict';
    
         globalVariable = true; // will throw error
         var scopedVariable = true; // only accessible inside this IIFE
    
    })();
    
    globalVariable = true; // will define a global variable
    var scopedVariable = true; // is not really scoped, since its scope is global
    

我会说它更安全,是的。至少你的变量不能通过浏览器控制台轻松访问。

我强烈建议使用IIFE,Douglas Crockford - http://javascript.crockford.com/ ......他主张parens应该在声明(function(){ }())

答案 1 :(得分:0)

它既不安全也不安全。

与命名函数相比,匿名函数的缺点是它只被调用一次(或每个父函数一次),因为该代码块被读取。它不能通过名称来调用。

与命名函数相比,匿名函数的优点是语法更短。

但是如果问题是是否使用这个匿名函数作为包装器,我真的没有看到任何优势。它只是添加额外的代码。

编辑:如果您的匿名函数稍长,并且包含变量,我可以看到避免使用这些变量名称污染全局范围是有用的。但在你的例子中,情况并非如此。请参阅此答案,以了解它对命名空间有用的方法:https://stackoverflow.com/a/2421949/4992551