LINUX.ORG.RU

js «sctrict mode» function + this = undefined 8(

 


0

2
>"use strict"; 
 (function () {
    console.debug("this1", this);
 })();
this1 undefined
>"use strict"; 
 function c() {
    console.debug("this1", this);
 };
 c();
this1 Window 

Внимание вопрос, как это объяснить?

Deleted

Последнее исправление: Deleted (всего исправлений: 2)

Ответ на: комментарий от Ja-Ja-Hey-Ho

ECMA-262 5th Edition - Annex C

If this is evaluated within strict mode code, then the this value is not coerced to an object. A this value of null or undefined is not converted to the global object and primitive values are not converted to wrapper objects. The this value passed via a function call (including calls made using Function.prototype.apply and Function.prototype.call) do not coerce the passed this value to an object (10.4.3, 11.1.1, 15.3.4.3, 15.3.4.4).

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

это все прекрасно, и даже хорошо, только это не отвечает на вопрос, функция то создается и вызывается в одном контексте, и отличается только то что второй раз у нее есть имя (причем если анонимную функцию присвоить переменной и вызвать - то this будет).

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

У меня в обоих случаях undefined:

"use strict"; 
 (function () {
    console.debug("this1", this);
 })();
VM243:3 this1 undefined
undefined
"use strict"; 
 function c() {
    console.debug("this1", this);
 };
 c();
VM245:3 this1 undefined
undefined

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

тогда везде, тому шо this по идее должен захватываться при объявлени функции, у тебя он не захватывается, у меня в зависимости от контекста выполнения, у deep-purple - всегда

UPD.

О блин, у deep-purple - не strct-mode

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Кстати, если в Firefox вызывать функцию через call, результат правильный получается:

"use strict"; 
 function c() {
    console.debug("this1", this);
 };
 c.call();
this1 undefined

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Deleted

О, щас с стриктом проверил — undefined. То же самое и не в консоли, а в живом файле.

Так що — видимо везде будет так.

deep-purple ★★★★★
()
Ответ на: комментарий от Deleted

this не захватывается при объявлении функции (если это не стрелка), в этом и есть вся багофича this в js.

const foo = function foo() { console.debug(this) };
const bar = () => console.debug(this);

const o = {a: {}};
o.foo = foo;
o.bar = bar;
o.a.foo = foo;
o.a.bar = bar;
o.foo();
o.bar();
o.a.foo();
o.a.bar();
foo();
bar();

strict на правила захвата не влияет.

x3al ★★★★★
()
Ответ на: комментарий от x3al

в этом и есть вся багофича this в js.

дык, известно, но без strict this был доступен, а теперь - нет, причем в одном случае остается доступен

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Я не могу воспроизвести this === window в strict mode. Может, ты опечатался во втором примере, когда тестил?

x3al ★★★★★
()
Ответ на: комментарий от Deleted

Где ты взял настолько, эмм, античного жирнолиса?

"use strict"; 
 function c() {
    console.debug("this1", this);
 };
c();
this1 undefined 
undefined
Жирнолис 51x64, оффтопик.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от x3al

элементарно, дебьян же

значит сие недоработка ff и уже поправлена

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Ехал bind через bind спасёт отца русской демократии.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.