2016-12-16 53 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