#javascript
#javascript
Вопрос:
в последние несколько дней я изучал, как работают большие фреймворки, как они назначают имя своей функции, и оно не может (?) Быть переопределено, я в значительной степени знаю, как фреймворк работает с анонимной функцией, например, они делают это таким образом или аналогичной версией :
(function(){
var Sizzle = function (){
var x;
};
Sizzle.f = function(){
alert("!");
};
window.Sizzle = Sizzle;
})();
я до сих пор мало что понимаю в этих огромных фреймворках, и я надеюсь, что смогу найти ответ :
- как они присваивают имя функции, а имя не может быть переопределено?
- в приведенном выше коде для вызова функции мне нужно написать 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:
Отвечая на ваши вопросы
-
В верхней части jQuery вы увидите:
var jQuery = (function() {
, который создает локальную функцию (она неполная;});
происходит в другом месте).В самом конце jQuery вы заметите следующее, как он присоединяет его к глобальному пространству имен:
// Expose jQuery to the global object window.jQuery = window.$ = jQuery;
-
Я никогда не видел, чтобы функция 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:
- использование
function _name_() {}
и имя являются статическими - просто используйте
var $ = jQuery;
для создания псевдонима.
Комментарии:
1. Что вы подразумеваете под # 1? В JavaScript
static
имеет значение, отличное от того, как вы используете это слово здесь. Пожалуйста, уточните.2. не могли бы вы пойти немного дальше и добавить пояснения?
Ответ №5:
jQuery работает таким образом:
Предполагается, что у вас есть этот код jQuery:
$("#title").show();
У вас есть три элемента в этой строке.
$
является ли функция javascript"#title"
является аргументом для этой функции.show()
это вызов метода
Вот как это работает.
- Javascript выполняет функцию с именем
$
и передает ей аргумент"#title"
. - Эта функция выполняет свою работу, находит
#title
объект в DOM, создает объект jQuery, помещает этот элемент DOM в массив в объекте jQuery и возвращает объект jQuery. - Затем механизм выполнения Javascript принимает возвращаемое значение из этого вызова функции (который теперь является объектом jQuery), ищет и выполняет
.show()
метод для этого объекта. - Затем
.show()
метод просматривает массив элементов DOM в объекте jQuery и выполняет операцию show для каждого элемента DOM.
Отвечая на ваш вопрос, не существует .show()
всего само по себе. Это метод для объекта jQuery, и в этом примере этот объект jQuery возвращается из $("#title")
вызова функции.