2013-09-09 4 views
0

Я писал глобальную функцию javascript. И после некоторых ошибок (и нескольких поисков здесь) я получил это для работы. Но я также видел пример с (функция ($) {code here} (Jquery);?.

чем разница (если таковая имеется), и есть ли какие-либо преимущества от варианта 1 и 2 и выполнить свою задачу хорошо, я просто пытаюсь узнать разницу

.

ВАРИАНТ # 1

(function($){ 

    TEAM={ 
     getQB: function(success, failure) { 
      var user=USER.user_data.login.toUpperCase(); 
      $.ajax({ 
      type: "GET", 
      url: "/nfl/getQB?username="+user, 
      dataType: 'json', 
      async: false, 
      success: success, 
      error: failure, 
      timeout: 6000 
       }); 

      }, 
     getRB: function(success, failure) 
      { 
       userx=USER.user_data.login.toUpperCase(); 
        $.ajax({ 
      type: "GET", 
      url: "/nfl/getRB?username="+userx, 
      dataType: 'json', 
      async: false, 
      success: success, 
      error: failure, 
      timeout: 6000 
        }); 

      } 
    } 

})(jQuery); 

ВАРИАНТ # 2

var TEAM={ 
     getQB: function(success, failure) { 
      var user=USER.user_data.login.toUpperCase(); 
      $.ajax({ 
      type: "GET", 
      url: "/nfl/getQB?username="+user, 
      dataType: 'json', 
      async: false, 
      success: success, 
      error: failure, 
      timeout: 6000 
       }); 

      }, 
     getRB: function(success, failure) 
      { 
       userx=USER.user_data.login.toUpperCase(); 
        $.ajax({ 
      type: "GET", 
      url: "/nfl/getRB?username="+userx, 
      dataType: 'json', 
      async: false, 
      success: success, 
      error: failure, 
      timeout: 6000 
        }); 

      } 
    } 
+0

Если это весь код, нет никакой разницы, за исключением того, что опция № 1 не будет работать в строгом режиме. – bfavaretto

+0

Возможный дубликат [Javascript сразу вызвал функциональные шаблоны] (http://stackoverflow.com/questions/10984652/javascript-immediately-invoked-function-patterns) –

ответ

2

Вариант 1

(function($){ code here })(jQuery) является немедленно вызываемыми выражением функции. Он предоставляет временную область для переменных, объявленных внутри нее. Таким образом, в этом случае вы передаете ссылку на JQuery, к которой будет обращаться $ только внутри этого блока кода.

jQuery.noConflict(); //Remove assignment to $ 

(function($){ 
    console.log($); //jQuery function 
})(jQuery) 

console.log($); //undefined 
console.log(jQuery); //jQuery function 

Вариант 2

Если код не находится в пределах области видимости функции, она придает TEAM к window объекта. Это загрязняет глобальное пространство имен, и пара потенциально может вызвать проблемы в будущем. Представьте, если кто-то сделал другой объект/функцию с тем же именем в глобальном. В зависимости от вашего кода, ваш TEAM может быть перезаписан.

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

+1

Примечание: чтобы 'jQuery' отказался от присвоения' $ 'вам нужно вызвать' jQuery.noConflict() '. В противном случае точно правильно! –

+0

Спасибо, Алекс! Я забыл, что назначение было автоматическим. –

+0

Огромное спасибо миллион! Теперь я понимаю, почему другие люди сделали вариант 1. –

0

В первом варианте вы уверены, что вы используете JQuery, потому что вы передаете его в качестве параметра закрытия. Во втором варианте у вас может быть что-то другое, что стоит за $.