2013-07-28 5 views
2

В моем javascript-коде у меня есть функция, выполняющая анонимную функцию, которая выполняется немедленно. Внутри у меня есть document.ready(), который гарантирует, что дом готов, прежде чем делать вещи. Просто интересно, является ли document.ready в моем коде избыточным или нет.Самостоятельное выполнение анонимных функций в javascript

(function() { 
"use strict"; 
var app = { 
    init: function() { 
     app.addLun('Hello'); 
     $('#some_id').on('click', this.changeStuff); 
    }, 
    changeStuff: function(e) { 
     e.preventDefault(); 
     $('#some_id').text("Cool text"); 
    }, 
    addLun: function(a) { 
     console.log(a); 
    } 
}; 
$(document).ready(function() { 
    app.init(); 
}); 
})(); 
+3

Это зависит от того, где находится этот код. Но я бы сказал, что это важно, так как ваш метод 'init' обращается к DOM, поэтому он должен быть готов. В худшем случае сценарий DOM уже готов (так или иначе) и 'app.init();' выполняется немедленно. В этом нет ничего плохого. Тем более, что я бы предположил, что, поскольку метод называется 'init', он будет вызываться только один раз ... так что это не похоже на' $ (document) .ready ('part будет выполняться много раз – Ian

+0

Это не правда примените к вам atm, но просто слово предостережения: вызов '$ (document) .ready (function() {...});' несколько раз (например, внутри цикла) вызовет вызов внутренней функции несколько раз .. Я видел, как это случалось на SO несколько раз, поэтому я думал, что просто выброшу это там. – asifrc

ответ

4

прямоприменяемых анонимные функции и обработчик события ready JQuery не имеют ничего общего друг с другом, так нет, это не лишнее.

2

В общем, нет. Вызываемое выражение функции немедленно вызывается немедленно, тогда как $(document).ready может задержать выполнение. Если вы знаете, что весь блок кода будет выполнен после того, как DOM будет готов, то это будет лишним, но это, вероятно, не так.

Вы можете, однако, заменить немедленно вызываемое выражение функции с переходом всего блока $(document).ready, например:

$(document).ready(function() { 
    "use strict"; 
    var app = { 
     // ... 
    }; 
    app.init(); 
}); 
+0

+1.Хороший призыв положить все это в готовый обработчик, отметив, что, хотя это определенно хорошо для показанного примера, очевидно, это может быть не для других случаев. – nnnnnn

0

Если вы не пишите $ (документ) .ready часть, то вы будете получить доступ к $ ('# some_id') внутри функции init, не дожидаясь события $ (document) .ready, которое не будет работать естественным образом. С document.ready, он будет работать, хотя и имеет те же результаты, что и следующий код:

$(document).ready(function() 
{ 
    "use strict"; 

    var app = { 
     init: function() { 
      app.addLun('Hello'); 
      $('#some_id').on('click', this.changeStuff); 
     }, 
     changeStuff: function(e) { 
      e.preventDefault(); 
      $('#some_id').text("Cool text"); 
     }, 
     addLun: function(a) { 
      console.log(a); 
     } 
    }; 

    app.init(); 
}); 
+0

_ «Вы получаете доступ к $ ('# some_id'), не дожидаясь события $ (document) .ready" _ - Нет, в коде OP, который находится внутри метода, вызываемого из готового обработчика. – nnnnnn

+0

Вы были правы, я выразил себя не так. –

+1

Прохладный, обновление лучше. Обратите внимание: если весь скрипт появляется в конце тела (или где-нибудь _after_ рассматриваемый элемент (ы)), вам не нужен готовый обработчик. – nnnnnn

0

Ответ No.Its не лишний.

Причина:

  1. самоосуществляющейся функция выполняется мгновенно т.е. будет выполняться, как только он встречается в JavaScript.
  2. $(document).ready(function() {})(); будет срабатывать только после того, как элементы дома полностью построены.

поэтому в основном, нет никакого смысла в ограждающих $(document).ready(function() {})(); в пределах (function(){ ... })(); .Как бывший часть будет ждать всех элементов DOM, чтобы подготовиться и потом сразу же приступить к исполнению.

Примечание:

Теперь, в случае, если мы используем чистый Javascript, и мы хотим, чтобы выполнить что-то после дом готов, то просто загрузите скрипт перед окончанием тега тела </body>.

REFER THIS LINK

+0

В примере OP функция готовности должна быть заключена в IIFE, поскольку в противном случае она не сможет получить доступ к переменной 'app'. – nnnnnn

+0

моя цель - весь код будет по-прежнему очень хорош, если он напишет enire материал внутри dom.ready или если нет dom, готовый просто включите скрипт внизу, перед тегом body body –

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