Итак... ES6¹ (который стандартизован несколько часов назад) предоставляет параметры по умолчанию для функций, аналогичных функциям PHP, Python и т.д. Я могу делать такие вещи, как:
function foo (bar = 'dum') {
    return bar;
}
foo(1); // 1
foo(); // 'dum'
foo(undefined); // 'dum'
MDN говорит, что значение по умолчанию для параметра оценивается во время вызова. Это означает, что каждый раз, когда я вызываю функцию, выражение 'dum' снова оценивается (если только реализация не делает некоторые странные оптимизации, которые нам не нужны).
Мой вопрос: как this играет в это?
let x = {
  foo (bar = this.foo) {
    return bar;
  }
}
let y = {
  z: x.foo
}
x.foo() === y.z(); // what?
Транзитор babel в настоящее время оценивает его как false, но я этого не понимаю. Если они действительно оцениваются во время разговора, что с этим делать:
let x = 'x from global';
function bar (thing = x) {
  return thing;
}
function foo () {
  let x = 'x from foo';
  return bar();
}
bar() === foo(); // what?
Трансилер babel в настоящее время оценивает значение³ как true, но я не понимаю. Почему bar не принимает x из foo при вызове внутри foo?
 <суб > 1 - Да, я знаю, что это ES2015. 
2 - Пример A 
3 - Пример B
суб >
