2012-03-15 3 views
1

Я вижу это по всей нашей кодовую:Установка вещей в неопределенном

(function(undefined) { 
    var foo = { 
     dirtyRow: undefined, 
     dirtyCells: undefined, 
     ... 
     clearDirty: function() { 
      this.dirtyRow = undefined; 
      this.dirtyCells = undefined; 
     } 
    } 
})(); 

Может кто-то сформулировать для меня, что случилось с этим? Что мы должны делать вместо этого?

+0

По крайней мере, вы можете видеть, что объект может/должен содержать. Хотя установка их на «null» может быть более семантической. – pimvdb

+0

@pst: Потому что сложнее различать то, что не существует, и что-то, что было определено как неопределенное. Я думаю, что мнения разные. – pimvdb

+0

@pimvdb К сожалению, я пропустил критическую часть кода: моя проблема в том, что он использует 'undefined' как имя параметра * *, что может вызвать всевозможные беспорядки! –

ответ

3

null В этом контексте имеет смысл, чем undefined, поскольку вы определяете переменные, но еще не присваиваете им значение.

Однако оба значения null и undefined являются значениями ложности, поэтому по большей части поведение будет таким же.

null - ключевое слово, хотя undefined - нет. Таким образом, null будет более «надежным», даже если вы используете аргумент, чтобы гарантировать, что undefined фактически не определено.

+2

Я могу согласиться с первым, но не с последним. Если значение 'undefined' оценивается, даже если оно действительное, изменяется, тогда среда программирования утратила свой контракт. Я считаю, что это ничем не отличается от 1 + 1 возвращения 3 раза. –

0

Неверная вещь заключается в том, что вы не должны использовать константу «undefined», пока все браузеры не будут соответствовать последней версии спецификаций Javascript.

В последнее время спецификации изменили его на реальную константу, но все старые браузеры соответствуют старым спецификациям, где это записываемое значение. Это означает, что идентификатор undefined можно изменить на другое значение, что, конечно же, сделает этот код тем, что не предназначалось.

+0

Это было переданный как пресловутый аргумент здесь, который должен хорошо работать. – pimvdb

+2

Я прошу различить «постоянный» материал (программирование - это работа с набором допущений, а если они нарушены, то контракт не работает). Однако, что я * do * полагаем, что * нельзя использовать 'undefined' в качестве имени параметра или переменной * (даже в попытке« исправить »постоянную проблему). –

+1

@pst: Естественно, вы не можете проверить все и избежать чего-либо, но есть некоторые вещи, которые вам следует избегать, поскольку они не указаны/реализованы неправильно. – Guffa

0

Я не вижу ничего плохого в этом коде. Этот подход используется для обеспечения того, что undefined действительно «не определено», потому что в нестандартном режиме (ES5) вы можете переопределить это значение (поэтому, если вы используете сторонний скрипт или на вашей странице будет введен вредоносный скрипт).

В принципе, у вас есть аргумент, и вы вызываете эту функцию без какого-либо значения, поэтому она будет «неопределенной». Вы можете получить тот же результат, имеющий:

(function(u) { 
    var foo = { 
     dirtyRow: u, 
     dirtyCells: u, 
     ... 
     clearDirty: function() { 
      this.dirtyRow = u; 
      this.dirtyCells = u; 
     } 
    } 
})(); 

Но, конечно же, с помощью undefined имеет больше смысла.

+0

Я не согласен с этим, имея больше смысла, за исключением того, что он показывает *, что здесь происходит. Если среда устанавливает, что 'undefined' оценивается как ... не неопределенный ... тогда среда уже нарушена. (Я просто оставил бы предположение/правило на месте и удалял параметр «undefined» в исходном коде.) Все это в стороне, имеет ли смысл установить значение, чтобы показать «форму» объекта? –

+0

Делает больше смысла в том, что 'undefined' более« поддается », чем' u' или что-то еще. На самом деле, среда нарушена, вы не сможете переопределить 'undefined' (это звучит забавно даже для чтения). Таким образом, это обходное решение для безопасного использования на языке, который сломан. В ES5 в строгом режиме infact вы не можете этого сделать: вы получаете исключение. – ZER0

Смежные вопросы