путаница в отношении присвоения значения & ldquo; undefined & rdquo ;, с использованием IIFE с & ldquo; undefined & rdquo; как параметр [duplicate]

См. эту ссылку Codepen для быстрого и простого способа проверки элемента, если он имеет определенный класс с использованием ванильного JavaScript ~!

hasClass (Vanilla JS)

function hasClass(element, cls) {
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}

16
задан JaPerk14 23 June 2012 в 07:17
поделиться

3 ответа

Что это делает, переназначает 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.

И из 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}.

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.

17
ответ дан Prasenjit Kumar Nag 1 September 2018 в 06:18
поделиться

jQuery гарантирует, что undefined действительно не определено в пределах своей области действия, не передавая аргумент этому параметру.

Возьмите этот код, например, когда undefined на самом деле не определено:

var undefined = 1;
alert(undefined); // 1
2
ответ дан Casey Chu 1 September 2018 в 06:18
поделиться

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));
3
ответ дан thecodeparadox 1 September 2018 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: