Что не так с моим выражением немедленного вызова функции? - PullRequest
2 голосов
/ 27 февраля 2012

ниже я попытался сделать очень простой IIFE,

<script type="text/javascript">

    var obj = new Object;

    (function(_obj) {_obj.prop = 'defined';})(obj);

    if(typeof obj.prop === undefined)
     alert('undefined');
    else
     alert(obj.prop);

</script>

Почему в результате скрипт предупреждает «undefined», а не «define»?

@ EDIT

Скрипт работает должным образом, за исключением:

  • Непреднамеренный typeof obj.prop === undefined не так, но obj.prop === undefinedследует использовать вместо этого.
  • Если опустить скобки ниже, скрипт не будет работать должным образом, но из носорога не возникает ни одной синтаксической ошибки.

    function(_obj) {_obj.prop = 'defined';}(obj);

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

Ваш код предупреждает 'defined', но по неправильной причине.

Этот ...

typeof obj.prop === undefined

должно быть это ...

obj.prop === undefined

... потому что typeof возвращает строку, представляющую тип объекта.


Не используйте взлом typeof при тестировании на undefined. Это сбивает с толку, и может быть источником ошибок, таких как тот, с которым вы столкнулись.

Если вы беспокоитесь о переопределении undefined, то сделайте это ...

obj.prop === void 0
1 голос
/ 27 февраля 2012

typeof возвращает строку.Итак, вам нужно;

if(typeof obj.prop === "undefined")

Код, похоже, работает, как и ожидалось, после устранения этой проблемы: http://jsfiddle.net/jfriend00/KJBjG/

1 голос
/ 27 февраля 2012

Должно быть:

if ( typeof obj.prop === 'undefined' )

Оператор typeof возвращает строки.

...