var obj, method;
obj = {
go: function() { console.log(this); }
};
(method = obj.go)()
ПРИМЕЧАНИЕ: первый комментарий Федора к его ответу - это то, что мне помогло больше всего. Как следует из темы, это было больше о скобках, чем this
.
В последней строке я понимаю, что круглые скобки заставят код внутри выполняться первым, поэтому method
принимает значение свойства go
, которое является функцией.
Затем ()
вызывает эту функцию, которая записывает window
на консоль, потому что она не была вызвана как метод.
Если вместо (method = obj.go)()
вы введете method = obj.go()
, он сначала запустит функцию go
, а method
примет возвращенное ею значение. Поскольку go
ничего не возвращает, это будет undefined
. Значение, напечатанное go
, будет obj
.
Чего я не понимаю, так это почему, если я делаю (obj.go)()
, напечатанное this
будет obj
, а не window
?
Учитывая, как работает другой код, я ожидал, что этот код будет работать примерно так:
obj.go
вычисляется сначала в скобках, а затем функция запускается как IIFE (function() { console.log(this); })()
. Так как функция не вызывается как метод obj
, this
по умолчанию имеет значение window
.