Итак... 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
?
x.foo === y.foo
, что явно равноfalse
, потому что в обоих случаях вы вызываете функциюfoo
, но в первом случаеthis === x
, а во втором случаеthis === y
. Вопрос, похоже, действительно в том, почему по сутиlet x = {foo(){ return this; }}; let y = {z: x.foo}; y.foo() === y
. Ответ в том, чтоy.foo()
это то же самое, что иy.foo.call(y)
. Вот как определяетсяthis
. - person loganfsmyth   schedule 18.06.2015