Функция Init в javascript и как она работает
Я часто вижу следующий код:
(function () {
// init part
})();
но я никогда не мог понять, как это работает. Я нахожу последние скобки особенно запутанными.
Может ли кто-нибудь объяснить, как это работает с точки зрения контекстов выполнения (EC) и переменных объектов (VO)?
7 ответов:
этот шаблон создаст новый контекст выполнения (EC), в котором будут жить любые локальные переменные объекты (VO), а также умрет, когда EC выйдет. Единственное исключение из этой жизни - для VO, которые становятся частью a закрытие.
обратите внимание, что JavaScript не имеет волшебной функции "init". Вы можете связать этот шаблон с таким, поскольку большинство уважающих себя библиотек JS (jQuery, YUI и т. д.) сделает это так, чтобы они не загрязняли глобальные NS больше, чем им это нужно.
демонстрация:
var x = 1; // global VO (function(){ var x = 2; // local VO })(); x == 1; // global VO, unchanged by the local VO2-й набор "скобок" (которые на самом деле называются паренсами или набором скобок), просто вызывают выражение функции, непосредственно предшествующее ему (как определено предыдущим набором скобок).
как я обычно объясняю это людям, чтобы показать, как это похоже на другие шаблоны JavaScript.
во-первых, вы должны знать, что есть два способа объявить функцию (на самом деле, есть по крайней мере пять, но это два основных виновника):
function foo() {/*code*/}и
var foo = function() {/*code*/};даже если эта конструкция выглядит странно, вы, вероятно, использовать его все время при подключении события:
window.onload=function(){/*code*/};вы должны заметить, что вторая форма не сильно отличается от обычной переменной:
var bar = 5; var baz = 'some string'; var foo = function() {/*code*/};но в JavaScript, у вас всегда есть выбор между использованием значения непосредственно или через переменную. Если
barи5, тогда следующие два утверждения эквивалентны:var myVal = bar * 100; // use 'bar' var myVal = 5 * 100; // don't use 'bar'Ну, если вы можете использовать
5сам по себе, почему вы не можете использоватьfunction() {\*code*\}сам по себе тоже? На самом деле, вы можете. И вот вызывается анонимная функция. Таким образом, эти два примера также эквивалентны:var foo = function() {/*code*/}; // use 'foo' foo(); (function(){/*code*/}()); // don't use 'foo'единственная разница, которую вы должны увидеть в дополнительные скобки. Это просто потому, что если вы начинаете строку с ключевого слова
functionпарсер будет думать, что вы объявляете функцию, используя первый узор в верхней части этого ответа и бросить синтаксическая ошибка. Поэтому оберните всю свою анонимную функцию внутри пары фигурных скобок, и проблема исчезнет.в других слова, следующие три утверждения действительны:
5; // pointless and stupid 'some string'; // pointless and stupid (function(){/*code*/}()); // wonderfully powerful
код создает анонимную функцию, а затем сразу же запускает ее. Похоже на:
var temp = function() { // init part } temp();цель этой конструкции-создать область для кода внутри функции. Вы можете объявить varaibles и функции внутри области, и они будут локальными для этой области. Таким образом, они не загромождают глобальную область, что минимизирует риск конфликтов с другими сценариями.
Я не могу поверить, что никто не ответил на вопрос ops!
последний набор скобок используется для передачи параметров в анонимную функцию. Итак, в следующем примере создается функция, а затем выполняется с x=5 и y=8
(function(x,y){ //code here })(5,8)Это может показаться не очень полезным, но оно имеет свое место. Самый распространенный из них я видел это
(function($){ //code here })(jQuery)что позволяет jQuery быть в совместимом режиме, но вы можете ссылаться на него как на " $ " в анонимном режиме функция.
сам вызов анонимной функции (SIAF)
самопроизвольные функции выполняются мгновенно, даже если DOM не полностью готов.
документ jQuery.готов против самостоятельного вызова анонимной функции
в простом слове вы можете понять, что всякий раз, когда страница загружается, эта вторая пара скобок () функция будет вызывать default.Нам не нужно называть function.It известен как анонимная функция.
т. е.
(function(a,b){ //Do your code here })(1,2);Он же вроде как
var test = function(x,y) { // Do your code here } test(1,2);
его называют немедленно вызывающим выражение функции (IIFE). В основном связано с концепцией закрытия JavaScript. Основное использование заключается в запуске функции до изменения глобальной переменной, так что ожидаемое поведение кода может быть сохранено.
Comments