Size: a a a

JavaScript.Ninja

2020 May 14

D

DmitryZ in JavaScript.Ninja
Дима Полос
obj.method там стрелочная функция, у нее нет this, она берет его из окружения, так что кол не подменит ей этого поведения
а если сделать её обычной функцией, что поменяется?
источник

ДП

Дима Полос in JavaScript.Ninja
тогда при obj.method() будет 12, а в случае obj.method.call(f) - undefined


Потому что obj.method() - вызываем явно указывая контекст obj

obj.method.call(f) - указываем функцию f как контекст, а в js у функций есть объекты-обертки, и у этого объекта нет ключа х
источник

ДП

Дима Полос in JavaScript.Ninja
я так думаю, не проверял
источник

IK

Illya Klymov in JavaScript.Ninja
у функций нет объекта обертки
источник

IK

Illya Klymov in JavaScript.Ninja
функция и есть объект
источник

IK

Illya Klymov in JavaScript.Ninja
обертки создаются только для примитивных типов
источник

D

DmitryZ in JavaScript.Ninja
Illya Klymov
А что смущает
Почему вызов
obj.method.call( f() )
выводит
3
3

а вызов
obj.method.call( new f() )
выводит
5
3
источник

D

DmitryZ in JavaScript.Ninja
источник

ДП

Дима Полос in JavaScript.Ninja
Illya Klymov
у функций нет объекта обертки
да, спасибо за уточнение, согласен
источник

IK

Illya Klymov in JavaScript.Ninja
DmitryZ
Почему вызов
obj.method.call( f() )
выводит
3
3

а вызов
obj.method.call( new f() )
выводит
5
3
потому что 5 выводится внутри функции. Функция-замыкание в 3 строке положила в window.x тройку, и потом method эту тройку вывел
источник

ДП

Дима Полос in JavaScript.Ninja
DmitryZ
Почему вызов
obj.method.call( f() )
выводит
3
3

а вызов
obj.method.call( new f() )
выводит
5
3
obj.method.call( f()) Вы вызываете функцию, она успевает заменить x
источник

AK

Andrey Katrusha in JavaScript.Ninja
ну
источник

AK

Andrey Katrusha in JavaScript.Ninja
тыж конентекс за скобками оставил
источник

IK

Illya Klymov in JavaScript.Ninja
отличие от первого в том что при вызове без new this указывает на window
источник

IK

Illya Klymov in JavaScript.Ninja
(бонусные очки начисляются тем, кто сразу укажет что с 'use strict' этот код не заработает)
источник

AK

Andrey Katrusha in JavaScript.Ninja
DmitryZ
У меня есть потрясающая задачка на контекст и всякие окружения.

function f() {
this.x = 5;
(function() {this.x=3;})()
console.log(this.x);
}

var obj = {
x: 12,
method: () => {console.log(this.x)}
}

f();
new f();
obj.method();
obj.method.call(f);

Какие 4 значения будут выведены в консоль?
4-й вариант я вообще не понимаю как объяснить.
так почитайте 40 раз про контекст и 40 раз сделайте функцию и дойдет
источник

AK

Andrey Katrusha in JavaScript.Ninja
DmitryZ
У меня есть потрясающая задачка на контекст и всякие окружения.

function f() {
this.x = 5;
(function() {this.x=3;})()
console.log(this.x);
}

var obj = {
x: 12,
method: () => {console.log(this.x)}
}

f();
new f();
obj.method();
obj.method.call(f);

Какие 4 значения будут выведены в консоль?
4-й вариант я вообще не понимаю как объяснить.
попробуйте в виндов засунуть икс и посмотреть что будет пример window.x = 43
источник

ДП

Дима Полос in JavaScript.Ninja
DmitryZ
Почему вызов
obj.method.call( f() )
выводит
3
3

а вызов
obj.method.call( new f() )
выводит
5
3
когда Вы вызываете f() у нее this - window, когда new f() - новый пустой почти объект, а вот внутри f есть еще IIFE, у который this это всегда window.
в use_strict как я помню this глобально - undefined?)
источник

AK

Andrey Katrusha in JavaScript.Ninja
Дима Полос
когда Вы вызываете f() у нее this - window, когда new f() - новый пустой почти объект, а вот внутри f есть еще IIFE, у который this это всегда window.
в use_strict как я помню this глобально - undefined?)
можно без вар еще сделать
источник

AK

Andrey Katrusha in JavaScript.Ninja
и без виндов
источник