2015-03-17 3 views
1

Я наткнулся на этот кусок кода:Разделительный код яваскрипта в функции

function isolate(win, fn) { 
     var name = '__lord_isolate'; 
     var iso = win[name]; 

     if (!iso) { 
      var doc = win.document; 
      var head = document.head; 
      var script = doc.createElement('script'); 

      script.type = 'text/javascript'; 
      script.text = 'function ' + name + '(f){new Function("window","("+f+")(window)")(window)}'; 
      head.insertBefore(script, head.firstChild); 
      head.removeChild(script); 

      iso = win[name]; 
     } 

     iso ? iso(fn) : new Function("window", "(" + fn + ")(window)")(win); 
    } 

это не то же самое, как функция самостоятельной вызывающем? Существуют ли какие-либо преимущества для использования этого?

Спасибо.

+0

Я знаю, что некоторые версии IE имели тенденцию просачивать имена функций за пределами их предполагаемого объема, поэтому, возможно, это позволяет избежать этого? Я действительно не уверен. –

+0

[Соответствует] (http://stackoverflow.com/q/86513/1169519). – Teemu

+1

Этот код ужасно. Где вы его нашли? – Bergi

ответ

1

Это не то же самое, что и функция вызова?

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

function isolate(win, fn) { 
    fn(win); 
} 

, как это stringify fn и повторно Eval его, уничтожая все закрытия в этом процессе.

Есть ли какие-либо преимущества для использования этого?

Да, это позволяет вам размещать функцию в другом глобальном масштабе. Если у вас несколько контекстов просмотра (например, iframes, tabs и т. Д.), Каждый из них будет иметь свою собственную глобальную область и глобальные объекты. Вставив этот сценарий с содержанием

function __lord_isolate(f) { 
    new Function("window", "("+f+")(window)")(window); 
} 

они создаем iso функцию, которая будет Eval и вызвать функцию f в данном win глобальном контексте.

Конечно, это скорее хак, чем решение (и даже не работает повсюду), а не хорошая практика, но могут быть случаи, когда это необходимо.

0

Имя функции изолировано и не является самоисключающим. Есть преимущества использования самозапускаемых функций. Например, это очень полезно для инициализации.

+1

Основная идея вопроса заключалась в том, почему вообще использовать этот подход – funguy

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