2016-12-16 6 views
0

Если я завершу свой скрипт в функцию анонимного стиля, например, когда компиляция в Coffeescript подходит для управления DOM?Javascript: оберните код анонимной функцией

  • Какая у него польза?
  • Какая у этого проблема?
  • Является ли мой код более безопасным?

(function() { 

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

}; 

}).call(this); 

ответ

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

Это не является ни более или менее безопасным.

Недостатком анонимной функции по сравнению с именованной функцией является то, что она вызывается только один раз (или один раз для каждой родительской функции), когда считывается этот блок кода. Он не может быть вызван по имени.

Преимущество анонимной функции в отличие от именованной функции будет короче синтаксиса.

Но если вопрос заключается в том, следует ли использовать эту анонимную функцию в качестве обертки, я действительно не вижу в этом никакого преимущества. Это просто добавление дополнительного кода.

EDIT: Если ваша анонимная функция была немного длиннее и содержала переменные, я вижу, что это полезно, чтобы не загрязнять глобальную область с этими именами переменных. Но в вашем примере это не так. См. Этот ответ для обсуждения того, как он полезен для пространства имен: https://stackoverflow.com/a/2421949/4992551.

Смежные вопросы