javascript: анонимная функция раскрывает функции (как на самом деле работают фреймворки)

#javascript

#javascript

Вопрос:

в последние несколько дней я изучал, как работают большие фреймворки, как они назначают имя своей функции, и оно не может (?) Быть переопределено, я в значительной степени знаю, как фреймворк работает с анонимной функцией, например, они делают это таким образом или аналогичной версией :

 (function(){
   var Sizzle = function (){
      var x;
   };
   Sizzle.f = function(){
     alert("!");
   };

   window.Sizzle = Sizzle;

})();
  

я до сих пор мало что понимаю в этих огромных фреймворках, и я надеюсь, что смогу найти ответ :

  1. как они присваивают имя функции, а имя не может быть переопределено?
  2. в приведенном выше коде для вызова функции мне нужно написать Sizzle.f(), чтобы заставить функцию работать, но когда я использую jquery, я не пишу Jquery.show() , просто show() , как они исчезают «jquery» из «jquery.show()»вызов функции?

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

заранее спасибо.

Комментарии:

1. Ваши пронумерованные вопросы не имеют смысла. (1) Что вы подразумеваете под «имя не может быть переопределено?» (2) Что вы подразумеваете под «когда я использую jQuery, я [просто пишу] show() » и что вы подразумеваете под «исчезновением ‘jQuery’ из вызова функции?» О каком вызове функции вы говорите? Было бы здорово, если бы вы могли уточнить это в своем вопросе, а не в комментариях.

2. Я думаю, вас могут смутить некоторые концепции и / или приложения концепций. Смотрите комментарий и запрос @Matt Ball.

3. Это опровергает ваш первый пункт: jsfiddle.net/kM9U3/1 И вам нужно будет привести пример второго, поскольку, если это не функция с глобальной областью действия, вы не можете вызвать ее так, как вы предлагаете, и уж точно не метод jQuery.

Ответ №1:

Как было показано для # 2, это действительно просто для BIG_NAMESPACE.Функции.doStuff можно добавлять ко всему, что вы хотите.

 var _ = BIG_NAMESPACE.Functions.doStuff;
_(); // runs BIG_NAMESPACE.Functions.doStuff;
  

Что касается # 1:

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

Итак, вы могли бы сделать что-то вроде:

 BIG_NAMESPACE.Functions.doStuff = function StealEverything() {};
(BIG_NAMESPACE.Functions.doStuff === StealEverything) // true;
  

Но у doStuff не было бы доступа ни к одной из переменных, скрытых внутри закрытия фреймворка.
Это также означало бы, что до перезагрузки страницы doStuff также не будет работать так, как вы этого хотите.

ОДНАКО в более новых версиях JavaScript (совместимые с ECMA5 браузеры) можно будет сделать что-то вроде того, что вы предлагаете.

 BIG_NAMESPACE = (function () {
    var do_stuff = function () { console.log("doin' stuff"); },
        functions = {
            set doStuff (overwrite) { }
            get doStuff () { return do_stuff; }
        };
    return { Functions : functions };
}());
  

Тогда это сработает:

 BIG_NAMESPACE.Functions.doStuff(); // "doin' stuff"
BIG_NAMESPACE.Functions.doStuff = function () { console.log("ain't doin' jack"); };
BIG_NAMESPACE.Functions.doStuff(); // "doin' stuff"
  

Однако фреймворки не будут использовать это в течение длительного времени.
Это даже отдаленно не совместимо с обратной связью. Возможно, в 2016 году…
Также были методы defineGetter и defineSetter, но они не являются формальной частью языка JavaScript. Как и innerHTML, это то, что производители браузеров используют, чтобы улучшить жизнь … … таким образом, нет реальной гарантии, что они будут в любом / всех браузерах, которые есть у ваших пользователей. Кроме того, они устарели, теперь, когда новые браузеры используют конструкции get и set, которые есть в других языках.

Ответ №2:

 (function(){

var jqueree = {};
jqueree.someval = 22;

jqueree.somefunc = function(){ alert(this.someval); };

window.jqueree = jqueree;

window.somefunc = function(){ jqueree.somefunc.call(jqueree); };

window.$$$ = jqueree;

})();

// all equivalent
window.somefunc();
window.jqueree.somefunc();
$$$.somefunc();
somefunc();
  

Комментарии:

1. я могу сделать это таким образом? окно. MYAPI = jqueree; ?

Ответ №3:

Отвечая на ваши вопросы

  1. В верхней части jQuery вы увидите: var jQuery = (function() { , который создает локальную функцию (она неполная; }); происходит в другом месте).

    В самом конце jQuery вы заметите следующее, как он присоединяет его к глобальному пространству имен:

        // Expose jQuery to the global object
       window.jQuery = window.$ = jQuery;
      
  2. Я никогда не видел, чтобы функция jQuery вызывалась без ссылки на объект jQuery. Я думаю, вам всегда нужно использовать jQuery.show() или $.show() ; однако, возможно, вы говорите, что вам не нужно вызывать window.jQuery.show() , который вам разрешено отбрасывать window , поскольку это значение по умолчанию.


Используя ваш пример

 (function(){

   /* This is where Sizzle is defined locally, but not exposed globally     */
   var Sizzle = function (){
      var x;
   };

   /* If you put "window.f = Sizzle.f = function(){" then you could         *
    * call f() w/o typing Sizzle.f()                                        */
   Sizzle.f = function(){
     alert("!");
   };

   /*  The following line is what makes it so you can use Sizzle elsewhere  *
    *  on your page (it exposes it globally here)                           */
   window.Sizzle = Sizzle;  

})();
  

Ответ №4:

  1. использование function _name_() {} и имя являются статическими
  2. просто используйте var $ = jQuery; для создания псевдонима.

Комментарии:

1. Что вы подразумеваете под # 1? В JavaScript static имеет значение, отличное от того, как вы используете это слово здесь. Пожалуйста, уточните.

2. не могли бы вы пойти немного дальше и добавить пояснения?

Ответ №5:

jQuery работает таким образом:

Предполагается, что у вас есть этот код jQuery:

 $("#title").show();
  

У вас есть три элемента в этой строке.

  1. $ является ли функция javascript
  2. "#title" является аргументом для этой функции
  3. .show() это вызов метода

Вот как это работает.

  • Javascript выполняет функцию с именем $ и передает ей аргумент "#title" .
  • Эта функция выполняет свою работу, находит #title объект в DOM, создает объект jQuery, помещает этот элемент DOM в массив в объекте jQuery и возвращает объект jQuery.
  • Затем механизм выполнения Javascript принимает возвращаемое значение из этого вызова функции (который теперь является объектом jQuery), ищет и выполняет .show() метод для этого объекта.
  • Затем .show() метод просматривает массив элементов DOM в объекте jQuery и выполняет операцию show для каждого элемента DOM.

Отвечая на ваш вопрос, не существует .show() всего само по себе. Это метод для объекта jQuery, и в этом примере этот объект jQuery возвращается из $("#title") вызова функции.