2016-12-16 101 views

回答

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 
    

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

我强烈建议使用IIFEs的一样,Douglas Crockford - http://javascript.crockford.com/ ......寿,他主张括号应在声明中(function(){ }())

0

它既不是更多或更少的安全。

与命名函数进行比较时,匿名函数的缺点是只有读取该代码块时才调用它(或每个父函数一次)。它不能通过名称来调用。

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

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

编辑:如果你的匿名函数稍微长一点,并且包含变量,我可以看到它是有用的,以避免使用这些变量名污染全局范围。但在你的例子中,情况并非如此。讨论如何对名称空间有用的讨论:https://stackoverflow.com/a/2421949/4992551