2012-06-12 3 views
2

Если я использую строгий режим, следующий код не работает. Он не работает на this.bar = 'foobar'; линия. Почему это так? Как я могу создать свойство объекта в строгом режиме?Невозможно создать свойства объекта в строгом режиме

<html> 
<body> 
<script> 
"use strict"; 
var foo = (function() { 
    this.bar = 'foobar'; 
    return this; 
}()); 
alert(foo.bar); 
</script> 
</body> 
</html> 

редактировать: Благодаря Джеймс Аллардисом для указывая на проблему. Я ошибочно думал, что функция самоисполнения создает объект, но это не так. Мне нужно было сделать одно из следующих вместо:

"use strict"; 
var foo = new function() { 
    this.bar = 'foobar'; 
}; 
alert(foo.bar); 

или (это один JSLint любит лучше)

"use strict"; 
var foo = (function() { 
    var obj = {}; 
    obj.bar = 'foobar'; 
    return obj; 
}()); 
alert(foo.bar); 

ответ

3

В строгом режиме, this не будет относиться к окну. В вашем примере удаление директивы строгого режима приведет к тому, что this ссылается на окно.

Поскольку в строгом режиме this в вашем примере - undefined, вы получаете сообщение об ошибке. Это потому, что вы не можете установить свойства для чего-то, что есть undefined.

От MDN (акцент на деталях, имеющих отношение к вашей ситуации):

Во-первых, значение передается как это функция в строгом режиме не упаковывается в объект. Для нормальной функции это всегда объект: предоставленный объект, если он вызван с оценкой объекта; значение, в коробке, если вызывается с булевым, строковым или числом this; или глобальный объект , если он вызван с неопределенным или нулевым ... Автоматический бокс - это стоимость исполнения, но обнажение глобального объекта в браузерах является угрозой безопасности, поскольку глобальный объект обеспечивает доступ к функциональности «безопасный» JavaScript среды должны быть ограничены. Таким образом, для строгой функции режима, указанное значение используется без изменений

+0

Должно ли это не ссылаться на анонимную функцию? –

+0

Нет. Если вы запустите это из строгой версии, 'this' будет ссылаться на окно. Значение 'this' зависит от того, как вызывается функция. –

+0

Также стоит прочитать: http://www.nczonline.net/blog/2012/03/13/its-time-to-start-using-javascript-strict-mode/ Поиск заголовка: «Устраняет это принуждение». – anddoutoi

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