2017-01-18 12 views
0

У меня есть проблема, чтобы понять в функции стрелки.Arrow функции как метод объекта - это не определено Окно

Я прочитал много ответов, например: Methods in ES6 objects: using arrow functions и УВК в этом описании Link github и все говорят, что этот должен связываться с окна, но когда я проверить эти примеры я вижу неопределен, если любой из вас, знаю, почему ?

var foo = { 
    bar:() => console.log(this) // lexical this is window or something else 
} 
foo.bar() 

Я использую столпотворение, чтобы transpile код:

var foo = { 
     bar: function bar() { 
      return console.log(undefined); 
     } 
} 

Бабель версии являются:

  • "столпотворение-ядро": "^ 6.21.0",
  • " «Babel-loader»: «^ 6.2.10»,
  • «babel-preset-es2015»: «^ 6.18.0»,
  • «babel-preset-stage-2»: «^ 6.18.0»,

но лексический это не только окно не определено, почему?

ответ

1

Похоже, вы используете webpack с модулями в стиле ES. Код внутри модулей не имеет скрытого доступа к глобальной области. То есть внутри модуля не привязан ни к чему. Webpack, по-видимому, заменяет глобальные ссылки на undefined, так что любой глобальный контекст не протекает, даже если он определен средой.

Если вы попытаетесь выполнить console.log("this: " + (() => this)()) в консоли браузера, вы увидите, что this, действительно, window.

+0

hmmm ...., ok, ваш ответ очень полезен, спасибо :) – Agata

+0

Вы можете передать '{modules: false}' в качестве своих опций 'babel-preset-es2015', чтобы остановить обработку модуля, если хотите. – loganfsmyth

+0

Интересно, к чему это приведет. Я имею в виду, что babel не может действительно знать, будет ли он выполнен в браузере или в другой среде, верно? – Forivin

1

Хорошо, окно не является частью стандарта javascript. И поскольку babel не знает контекста, в котором работает ваш скрипт, он просто будет использовать undefined.

В nodejs, например, глобальная область видимости будет global.
Хотя window обычно является глобальной областью при выполнении кода в браузере.

+0

ОК, спасибо :) – Agata

+0

Не совсем точный. Babel явно устанавливает 'this'' undefined', потому что 'this' указан как' undefined' в модулях ES6. – loganfsmyth

+0

Итак, поведение по умолчанию для babels предполагает, что входные файлы являются модулями? – Forivin