2012-03-08 2 views
6

Я недавно узнал о самоназывающих анонимных функциях. Некоторые фрагменты кода, с которыми я столкнулся, использовали функцию самообслуживания вместе с $ (document) .ready. Кажется излишним или бессмысленным использовать оба.

Есть случай, когда вы будете использовать

(function(){ 
    $(document).ready(); 
})(); 

vs.

$(document).ready(function(){ 
    (function(){})(); 
}); 

Я полагаю, что вы либо хотите, чтобы скрипт будет выполняться сразу же или после DOM загружен. Я не понимаю, почему вы использовали бы оба вместе.

Спасибо.

+4

FYI - они не эквивалентны. – Hamish

ответ

11

В первом примере определенно используется прецедент. Если у вас есть другие JS-библиотеки/сценарии, загруженные на ту же страницу, нет никакой гарантии, что они не переписывают переменную $. (Это очень часто, когда у вас есть Prototype и jQuery на той же странице).

Так что если Prototype использует $, вам нужно будет использовать jQuery в любое время, когда вы хотели работать с jQuery. Это может быть довольно некрасиво:

jQuery(function(){ 
    jQuery('a', '#content').bind('click', function(){ 
     if(jQuery(this).attr('href') == 'www.google.com') 
     { 
      alert("This link goes to Google"); 
      jQuery(this).addClass('clicked')); 
     } 
    }); 
}) 

Помните, что мы не можем использовать $, потому что это способ от прототипа в глобальном масштабе.

Но если вы завернул внутри этого ..

(function($){ 
    $(function(){ 

     // your code here 

    }); 
})(jQuery); 

$ будет на самом деле ссылки на библиотеку JQuery внутри в то же время со ссылкой на Prototype снаружи!Это может помочь привести в порядок код:

(function($){ 
    $(function{}(
     jQuery('a', '#content').bind('click', function(){ 
      if(jQuery(this).attr('href') == 'www.google.com') 
      { 
       alert("This link goes to Google"); 
       jQuery(this).addClass('clicked')); 
      } 
     }); 
    )); 
})(jQuery); 

Это общая картина с расширениями JQuery, чтобы гарантировать, что они всегда добавляются в объект JQuery, но могут быть написаны с использованием $, чтобы сохранить код аккуратно.

+0

Знаете ли вы о функции $ .noConflict()? Это устраняет зависимость от $. например var j = $ .noConflict(); указывает, что переменная j теперь равна $, поэтому j ("# ElementId"); будет действительным. Документация: http://api.jquery.com/jquery.noconflict/ –

2

Вы не хотели бы использовать оба вместе, есть ли что-то, что вы делаете, что требует от вас?

В JQuery апи документации здесь, http://api.jquery.com/ready/, вы можете увидеть эти примеры:

В .ready() метод обычно используется с анонимной функцией:

$ (документ) .ready (function() {
// Обработчик для .ready().

});

что эквивалентно вызову:

$ (функция() {.
// Обработчик .ready() называется

});

Но я не уверен, отвечает ли это на ваш вопрос, потому что я не вижу, где вы его действительно спрашиваете. Надеюсь, это поможет!

1

Единственная причина, по которой вы вводите другое закрытие, - ввести другую границу области для загрузки/защиты глобальных объектов, таких как $.

Для примера:

$(document).ready(function(){ 

    // Do upper scope things. 

    (function(){ 

     // Do lower scope things. 

    })(); 

}); 

Основываясь на вас говорят, что вы недавно узнав о этом материале я предполагаю, что вы relativly новичок в JavaScript.

Я собрал сообщение в блоге, которое могло бы помочь объяснить некоторые основные понятия, которые образуют точку зрения новичка на JavaScript, включая область функций. http://bit.ly/tLkykX

+0

Спасибо за ссылку Морис. Хорошо для чтения. Я бы пометила твое, а Колин был бы прав, если бы мог. – VtoCorleone

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