См. эту ссылку Codepen для быстрого и простого способа проверки элемента, если он имеет определенный класс с использованием ванильного JavaScript ~!
function hasClass(element, cls) {
return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
Что это делает, переназначает undefined
на undefined
внутри этого закрытия. Это безотказно. Поскольку другой код может случайно сделать что-то вроде
undefined = something;
console.log(undefined); // will output 'something'
И это действительно в javascript (если используемый JS-движок не реализовал спецификацию ECMAScript 5, в спецификации ECMAScript 5 undefined
нет non-writable
, MDN DOC ),
Цитата из MDN New_in_JavaScript 1.8.5 (ECMA 5) Страница
Изменения в глобальном объекты
Глобальные объекты, сделанные только для чтения
Объекты NaN, Infinity и неопределенные глобальные объекты были сделаны только для чтения по спецификации ECMAScript 5.
blockquote>И из
ES5 Annotated Spec
в Guthub
ES5 spec Section
x15.1.1.3
15.1.1.3 undefined
Значение undefined не определено (см. 8.1).
Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.
blockquote>Even если
global undefined
недоступен для записи. У вас может быть локальная переменная с именемundefined
и может испортить ваш код (в основном сравнение сundefined
). Но это ваша ответственность. У вас могут быть такие коды, как(function(){ console.log('Second Case: '); var undefined = 'Something'; console.log(undefined); // Will log `something` var a ; // a is undefined console.log(a === undefined); // false, as undefined is changed // you might expect a === undefined will return true, but as // `undefined` is changed it will return false. console.log(a); // undefined })();
Демо: http://jsfiddle.net/joycse06/V4DKN/
Однако, если
undefined
можно записать то указанное выше назначение может затруднить многиеcomparison
, сделанные с помощьюundefined
после этой строки кода, посколькуundefined
больше неundefined
. Теперь он имеет некоторое значение.Так как они вызывают эту анонимную функцию, например
( window ) // one argument only
И прием
( window, undefined) // only window is passed when calling the function // Second argument is not passed means it's undefined // so undefined is restored to undefined inside that function // and no global accidental assignments can hamper jQuery's // code using 'undefined' now
Это означает, что внутри этого закрытия
undefined
восстанавливается доundefined
, так как он не получил никакого значения, тем самым гарантируя использованиеundefined
внутри этой анонимной функции.Очень хорошая подробная статья об этом http: // javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/
Я цитирую некоторые строки из вышеупомянутой ссылки статьи, чтобы все было ясно
Что не определено?
В JavaScript есть Undefined (type), undefined (value) и undefined (variable).
Undefined (type) является встроенным Тип JavaScript.
undefined (value) является примитивным и является единственным значением типа Undefined.
Любое свойство, которому не присвоено значение, принимает неопределенное значение. (ECMA 4.3.9 и 4.3.10).
Функция без оператора return или функция с пустым оператором return возвращает undefined. Значение аргумента unsupplied function undefined.
var a; typeof a; //"undefined" window.b; typeof window.b; //"undefined" var c = (function() {})(); typeof c; //"undefined" var d = (function(e) {return e})(); typeof d; //"undefined"
undefined (variable) - это глобальное свойство, начальное значение которого не определено (значение). Поскольку его глобальное свойство мы также можем получить к нему как переменной , Для согласованности я всегда буду называть это переменной в этой статье.
typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"
Начиная с ECMA 3 его значение можно переназначить:
undefined = "washing machine"; //assign a string to undefined (variable) typeof undefined //"string" f = undefined; typeof f; //"string" f; //"washing machine"
Излишне говорить , переопределение значений неопределенной переменной является очень плохой практикой, и на самом деле она не разрешена ECMA 5.
jQuery гарантирует, что undefined
действительно не определено в пределах своей области действия, не передавая аргумент этому параметру.
Возьмите этот код, например, когда undefined
на самом деле не определено:
var undefined = 1;
alert(undefined); // 1
Undefined является типом, но также является глобальной переменной.
У вас может быть модуль, который перезаписывает значение undefined, выполняя undefined = whatever
.
undefined
в на самом деле является неопределенным параметром функции, обертывающей весь код:
(function(window, undefined) {
// undefined is the undefined parameter
}(window));
Это безопасно, поскольку параметр undefined
находится в локальной области, и никто, кроме кода в этой функции, не может назначить ему .
Нет необходимости использовать параметр undefined
в качестве параметра при определении анонимной функции.
Если вы увидите вышеприведенную функцию, вы заметите, что она ожидает два параметра, кроме одного.
Почему undefined
необходимо восстановить?
, потому что, чтобы убедиться, что undefined
действительно undefined
в области между фигурными фигурными скобками, даже если кто-то написал что-то вроде undefined = "defined";
в глобальном масштабе, потому что undefined
может быть действительно переопределено.
Итак, если у вас есть что-то вроде
var undefined = 1;
(function(window, undefined) {
console.log(undefined); // output will be undefined not 1
}(window));