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

Javascript:在匿名函数中包装代码,javascript,Javascript,如果我将脚本封装在匿名样式的函数中,比如在Coffeescript中编译时,脚本是否适合操作DOM 它有什么好处 这有什么问题 我的代码更安全吗 它不太安全 与命名函数相比,匿名函数的缺点是,在读取代码块时,它只被调用一次(或每个父函数调用一次)。不能用名字来称呼它 与命名函数相比,匿名函数的优点是语法更短 但是如果问题是是否使用这个匿名函数作为包装器,我真的不认为它有什么好处。它只是添加了额外的代码 编辑:如果您的匿名函数稍长一点,并且包含变量,我可以看到避免这些变量名污染全局范围是很有

如果我将脚本封装在匿名样式的函数中,比如在Coffeescript中编译时,脚本是否适合操作DOM

  • 它有什么好处
  • 这有什么问题
  • 我的代码更安全吗


它不太安全

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

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

但是如果问题是是否使用这个匿名函数作为包装器,我真的不认为它有什么好处。它只是添加了额外的代码


编辑:如果您的匿名函数稍长一点,并且包含变量,我可以看到避免这些变量名污染全局范围是很有用的。但在你的例子中,情况并非如此。请参阅此答案,了解其对名称空间的用处:.

完全合适。这通常被称为一个

好处是:

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

    (function ($, DOM, ultraSelector) {
    
         $(DOM).find(ultraSelector); // $ is always jQuery
    
    })(jQuery, document, 'mySelector');
    
    $ = false; // here $ is not jQuery anymore
    
  • 您的变量在您的范围内进行管理,永远不可能在全局范围内实现;及

  • 您可以安全地
    “严格使用”
    ,知道只有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
    
我想说它更安全,是的。至少您的变量不容易通过浏览器控制台访问

我强烈建议使用IIFEs,正如- ... 虽然他主张paren应该在声明中
(function(){}())

(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