Это то же самое, что и this
, где находится инициализатор объекта. Итак, в обоих ваших примерах это то же самое, что и this
, где находится ваша строка var a = ...
. this
никогда не изменяется в данном контексте выполнения, и инициализаторы объектов не создают новый контекст выполнения; только функции и eval
делают это. В ваших примерах единственный раз, когда создается новый контекст выполнения, — это когда вы вызываете fn
, а поскольку fn
является стрелочной функцией, она закрывается над this
в контексте выполнения, где он был создан (который является глобальным контекстом выполнения в ваши примеры).
Причина, по которой вы видите 100
вместо this.c
в вашем примере кода, заключается в том, что this
в глобальной области (в свободном режиме) относится к глобальному объекту, а var
переменные в глобальной области видимости становятся свойствами глобального объекта, и поэтому this.c
является глобальной переменной c
.
Если вы поместите весь этот код в функцию определения области видимости, например:
(function() { // Or `(() => {`, doesn't matter in this case
var c = 100;
var a = {
c: 5,
b: {
c: 10,
fn: ()=> {return this.c;}
}
}
console.log(a.b.fn());// still 100, why not 5?
})();
...this.c
будет undefined
, потому что, хотя this
по-прежнему будет ссылаться на глобальный объект, c
больше не будет глобальной переменной (и, следовательно, свойством глобального объекта).
Если вы хотите, чтобы this
внутри fn
ссылалось на b
в выражении a.b.fn()
, тогда вам не нужна стрелочная функция, вам нужна обычная функция; вы получите 10
(значение a.b.c
), а не 5
(значение a.c
).
Конечно, поскольку это одноразовый объект и fn
закрывается a
, вы также можете просто сделать тело fn
return a.c;
или return a.b.c;
в зависимости от того, какой c
вы хотите.
person
T.J. Crowder
schedule
05.06.2016
this
внутри функции стрелки будет относиться к ближайшей функции, внутри которой она находится. В вашем случае это только верхний уровень. - person mash   schedule 05.06.2016this
и область действия в значительной степени не связаны, аthis
лишь изредка относится к ... [a] функции. Но суть комментария, конечно, правильная. - person T.J. Crowder   schedule 05.06.2016this
,arguments
,super
иnew.target
лексически вместо того, чтобы определять свои собственные переменные, которые затеняют внешние. - person Johannes H.   schedule 05.06.2016this
. (Или, точнее: запись среды, созданная, когда мы их вызываем, этого не делает.) Вот почему они наследуютthis
контекста выполнения, в котором они созданы: они закрываются поверх него, точно так же, как закрываются поверх всего остального в этом контексте. (например, переменные). - person T.J. Crowder   schedule 05.06.2016