Что это за 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');
}();

вы увидите обозначения, такие как '()', '-', '+', '~', '!'

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

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