Функция экспорта / импорта шаблона анонимного члена - PullRequest
2 голосов
/ 05 ноября 2010

Я немного растерялся. Какова цель параметров при запуске шаблона анонимного члена, обозначенного ниже:

(function (<ParameterA>) {

})(<ParameterB>);
  1. Я понимаю, что параметр A используется для обозначения области действия функции, это правда?
  2. Параметр B, куда вы экспортируете функцию?

Наконец, я часто вижу сценарий, показывающий следующее:

})(jQuery || myfunc);

Значит ли это, что они экспортируют или возвращают эти объекты? И какой смысл использовать две трубы (||); Это полевая цель?

Заранее спасибо. С нетерпением жду интересного обсуждения.

Ответы [ 5 ]

4 голосов
/ 05 ноября 2010

Параметр A не обозначает область действия функции. Положение функции определяет область действия функции. Параметр B не там, где вы экспортируете функцию. Фактически, как это настроено, нигде нет указателя на функцию, что делает ее «анонимной функцией». Другими словами, как есть, сама функция неэкспортируемая. Обычно, когда вы говорите об экспорте, вы говорите об экспорте переменных, которые вы определили в анонимных функциях. Например, здесь я экспортирую функцию my_inner_function из анонимной функции.

(function (<ParameterA>) {
  // export this function here.
  window.my_inner_function = function() {
    ...
  };
})(<ParameterB>);

Обычно смысл анонимных функций в том, что у вас есть все виды переменных, которые вы не хотите экспортировать, потому что вы не хотите гадить с другим кодом.

(function (<ParameterA>) {
  // convert could be defined somewhere else too, so to be on the safe side
  // I will hide it here in my anonymous function so nobody else can
  // reference it.
  var convert = function() {
    ...
  };
})(<ParameterB>);

Это особенно важно, когда вы сжимаете свой Javascript и получаете имена функций, такие как a и b.

(function (<ParameterA>) {
  // So compressed!
  var a = function() {
    ...
  };
})(<ParameterB>);

(function () {
  // Another compressed thing! Good thing these are hidden within anonymous
  // functions, otherwise they'd conflict!
  var a = function() {
    ...
  };
})();

Теперь это

(function (<ParameterA>) {

})(<ParameterB>);

это то же самое, что и

// Assume ParameterB is defined somewhere out there.
(function () {
  var ParameterA = ParameterB;
})();

Что дает вам представление о том, почему вы используете параметры. Может показаться, что подход с использованием параметров менее запутан, или вы можете пояснить, что не хотите влиять на переменные «по значению», такие как числа и строки.

Как уже отмечали другие, a || b произносится как «a или b» и означает «a, если a оценивается как истинное, в противном случае b, независимо от того, что b».

Редактировать

Чтобы ответить на ваш вопрос, когда вы попадаете на })();, () запускает анонимную функцию. Помните, что движки Javascript сначала проанализируют весь код, чтобы убедиться в правильности синтаксиса, но на самом деле не будут оценивать / выполнять какой-либо код, пока не достигнут этого кода. Следовательно, когда анонимная функция запускается, var ParameterA = ParameterB; оценивается. Вот несколько примеров, которые, надеюсь, помогут.

var ParameterB = "hello";

(function () {
  var ParameterA = ParameterB;
  // alerts "hello" because when this line is evaluated ParameterB is still
  // "hello"
  alert(ParameterA); 
})(); // () here causes our anonymous function to execute

ParameterB = "world";

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

var ParameterB = "hello";

var myFunction = function () {
  var ParameterA = ParameterB;
  // alerts "hello" because when this line is evaluated ParameterB is still
  // "hello"
  alert(ParameterA); 
};

myFunction();

ParameterB = "world";

В этом примере я меняю порядок последних двух строк и получаю разные Результаты.

var ParameterB = "hello";

var myFunction = function () {
  var ParameterA = ParameterB;
  // alerts "world" because when this line is evaluated ParameterB has
  // already changed.
  alert(ParameterA); 
};

// notice that I moved this line to occur earlier.
ParameterB = "world"; 

myFunction();
3 голосов
/ 05 ноября 2010

Приведенный выше блок кода выполняет анонимную функцию сразу же после ее объявления.

  1. ParameterA - это параметр анонимной функции, которую вы объявляете
  2. ParameterB - это значениевы переходите к ParameterA

Таким образом, объявленная вами функция будет выполнена немедленно, передав ParameterB в качестве значения для ParameterA.

Блок jQuery || myFunc означаетthis: используйте jQuery в качестве аргумента, если он не определен, в этом случае используйте myFunc.

Редактировать:

Это часто используется при определении jQueryплагины, чтобы избежать конфликтов с переменной $, если используются несколько библиотек JavaScript.Таким образом, вы могли бы сделать определение вашего плагина функцией, которая принимает $ в качестве параметра, который вы должны выполнить немедленно, передав jQuery в качестве значения $.

Пример (из документации jQuery):

(function( $ ){
  $.fn.myPlugin = function() {
    // Do your awesome plugin stuff here
  };
})( jQuery );

Результатом приведенного выше блока кода будет определение плагина, в котором вам гарантировано, что $ будет псевдонимом для jQuery.

3 голосов
/ 05 ноября 2010

Для частей 1 и 2 ParameterA может использоваться для псевдонима вложенной иерархии.(то есть: YAHOO.util.Event passed в качестве ParameterB, может использоваться как "e" в ParameterA.) Таким образом, внутри анонимной функции вы не будете вводить полный путь к пространству имен.[Я знаю, что вы jquery, но пространство имен yahoo длиннее и лучше иллюстрирует суть :)] Кроме того, вы можете просто вручную сохранить ссылку в переменной внутри функции.

jquery || myFunc синтаксис - сокращение от «использовать jquery, если оно истинно / доступно, или myFunc, если это не так».

Это похоже на var toUse = jQuery !== undefined ? jQuery : myFunc;

Это потому, что javascript позволяет вычислять ложные значения без полного преобразования объектов в логическое значение.то есть: undefined - ложь, "" - ложь, ноль - ложь.

Альтернативу можно использовать, чтобы определить, доступен ли метод или свойство даже с &&.

т.е.: var grandParent = person && person.parent && person.parent.parent;

Это будет определено только в том случае, если у человека есть родитель, а у его родителя есть родитель.Любой сбой в &&, приводящий к последнему утверждению, приведет к тому, что grandParent будет неопределенным.

Наконец, скобки вокруг ||Синтаксис ярлыка в основном выполняет функцию сразу после объявления, передавая оцененное значение в анонимную функцию.

т.е.: (function(a, b) { return a + b; })(2,3)

Немедленно выполнится и вернется 5. На практике это анонимное выполнение функции может использоваться с шаблоном модуля для создания набора открытых методов, которые используют частные функции, которыесами по себе не отображаются в пространстве имен страницы.Это больше, чем ваш первоначальный вопрос, но вы можете проверить эту статью для получения дополнительной информации: http://yuiblog.com/blog/2007/06/12/module-pattern/

0 голосов
/ 05 ноября 2010

С первой частью:

(function (<ParameterA>) {

})(<ParameterB>);

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

Например:

(function($){

})(jQuery);

Это означает, что вы можете иметь $ какНапример, Mootools вне функции и как jQuery внутри нее.

С вашей второй частью:

})(jQuery || myfunc);

Это вызывает функцию, передающую переменную jQuery, если она существует, и myfunc если нет.Я не совсем понимаю, зачем ты это делаешь ...

0 голосов
/ 05 ноября 2010

ParameterA ссылается на значение, переданное в ParameterB.Это:

(function (<ParameterA>) {

})(<ParameterB>);

Это то же самое, что и это:

function test(<ParameterA>) {

}

test(<ParameterB>);

Разница в том, что таким образом вы используете закрытие, чтобы не иметь конфликтующих функций в глобальном пространстве имен.1007 *

Для второй части: ||работа вроде param = jQuery ? jQuery : myFunc.Он передается в jQuery, если он определен, или в myFunc, если это не так.

...