Что это за javascript?
Я нашел здесь
;(function ($, window, document, undefined) {
//code
}(jQuery, this, this.document));
Это первый раз, когда я вижу что-то подобное. Что это такое и как оно интерпретируется? Я не понимаю, почему он должен передать этот и этот документ, и что с undefined.
Я спрашиваю, потому что я включил его в свою страницу и
if($('ul.mtree').length)
Возвращает false, несмотря на то, что он возвращает true, когда я ввожу его в консоль.
Ответы
Ответ 1
Первая полуколония ;
устанавливает следующий код отдельно от любого другого предыдущего кода, который, возможно, забыл о запятой. Это важно, поскольку parens будут пытаться запускать предыдущие операторы как функцию, если не было найдено полуточку.
Для остальной части кода мы просто объявляем функцию "в строке", которая будет немедленно выполнена, когда аргументы $, window, document
затем создаются как jQuery, this, this.document
(соответственно) из глобальной области. Это прежде всего так, что вы можете использовать "$" в своем новом плагине jQuery, не беспокоясь, если $
была перезаписана где-то еще. Вы можете быть уверены, что $
совпадает с jQuery
.
Подробнее о "Защита псевдонима $и добавление области" здесь
Обновление от OP:
Для оператора if
, возвращающего false, убедитесь, что ваш html загружен во время вызова вашего оператора if
. Один быстрый способ сделать это - обернуть его в метод $(document).ready
следующим образом:
$(document).ready(function () {
if($('ul.mtree').length) {
alert("got 'em!");
}
});
Ответ 2
Это немедленно выполненная функция.; в начале защиты от возможных синтаксических ошибок после минимизации.
Сама функция предусматривает определение аргументов, а не привязку их к глобальной области. Он также обеспечивает конфиденциальность локальных переменных, определенных с помощью функции. Несколько запутанный окончательный параметр, переданный undefined
, защищает от вредоносных изменений, что undefined представляет в глобальной области.
Множество доступных ресурсов, если вы используете Google для таких терминов, как функции самостоятельного выполнения, глобальная область действия, закрытие, шаблон модуля.
Ответ 3
Может оказаться полезным включить копию кода, который у вас есть, который не работает.
Но ответ на вопрос о том, почему if($('ul.mtree').length)
может возвращать true
на консоли, но false
на странице может зависеть от синхронизации (например, функция выполняется до загрузки DOM). Когда вы загрузите консоль для проверки значения, DOM загрузится и вернет true.
Обязательно включите JS в конце страницы или вызовите только после загрузки документа.
Ответ 4
Возможно, этот код должен исправить случай, в котором $
, window
или document
были затенены другими значениями:
(function() {
var window = 123,
document = 'abc',
$ = Function.prototype;
})();
Затем
-
$
является сокращением, используемым jQuery
и другими библиотеками. Код предполагает, что jQuery
не был затенен чем-то другим, поэтому он создает переменную с именем $
со значением jQuery
.
-
this
- это ключевое слово. Когда он явно не задан в нестрогом режиме, он становится глобальным объектом. Таким образом, ваш код создает локальную переменную window
с этим значением. Обратите внимание, что это опасно, потому что this
может быть установлено на какое-то значение или be undefined
в строгом режиме.
- Предполагая, что
this
является глобальным объектом, this.document
будет объектом документа.
-
undefined
был свойством глобального объекта, у которого не было атрибута ReadOnly в ECMAScript 3, поэтому его можно было бы перезаписать. Ваш код создает локальную переменную без назначения какого-либо значения, поэтому она становится реальной undefined. Это больше не требуется с ECMAScript 5, потому что window.undefined
имеет атрибуты [[Configurable]] и [[Writable]], установленные на false
.
Затем
(function() {
var window = 123,
document = 'abc',
$ = Function.prototype;
(function($, window, document, undefined) {
// `$`, `window`, `document` and `undefined` have been restored
})(jQuery, this, this.document);
})();
Ответ 5
Если я правильно понимаю ваш вопрос, функция обозначения ;
впереди оператора функции, например
(function(){
console.log('no name');
})();
(function(){
console.log('no name')
}());
-function(){
console.log('no name');
}();
+function(){
console.log('no name');
}();
~function(){
console.log('no name');
}();
!function(){
console.log('no name');
}();
вы увидите обозначения, такие как '()', '-', '+', '~', '!'
и функция обозначений состоит в том, что синтаксический разбор выражения функции в выражение и немедленно выполнить функцию!
но я предлагаю вам просто использовать '()' для выполнения оператора функции, потому что это формальный способ и регулярный способ использования в рутине.