【发布时间】:2015-06-17 20:20:47
【问题描述】:
所以... 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 在foo 内部调用时不从foo 中获取x?
【问题讨论】:
-
是否有关于董事会接受ES6最终草案的公告?
-
@squint 规范在 ecma-international.org/ecma-262/6.0/index.html 上线 :)
-
你的比较结果基本上是
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的定义方式。
标签: javascript ecmascript-6 default-parameters