所以...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
from foo
当被叫到里面时foo
?
1 - Yes I know it is ES2015.
2 - Example A
3 - Example B
我的问题是,如何this
玩这个?我不明白。他们真的在通话时进行评估吗?
是的,参数初始值设定项在调用时进行评估。情况很复杂,但步骤基本如下:
- A 新的执行上下文建立在堆栈上,
with a 新环境在被调用函数的“闭包作用域”中
- 如果有必要的话是thisBinding已初始化
-
Declarations are instantiated:
- 创建参数名称的可变绑定
- 如果有必要的话,一个
arguments
对象被创建为一个绑定
- The 绑定被迭代初始化来自参数列表(包括所有解构等)
在此过程中,评估初始化器
- 如果涉及任何关闭,则会插入一个新环境
- 创建函数体中声明的变量的可变绑定(如果尚未通过参数名称完成)并初始化为
undefined
- 绑定
let
and const
函数体内的变量被创建
- 函数的绑定(来自主体中的函数声明)使用实例化函数进行初始化
- 最后函数体被求值.
所以参数初始化器确实可以访问this
和arguments
调用的,先前初始化的其他参数,以及其“上层”词法范围内的所有内容。它们不受函数体中声明的变量的影响(尽管它们受到所有其他参数的影响,即使处于临时死区)。
那这个呢:
function bar (thing = x) {}
{
let x = 'x from foo';
return bar();
}
我不明白。为什么bar
不采取x
from foo
当被叫时
里面foo
?
Because x
是一个局部变量bar
无权访问。我们很幸运有他们不是动态范围的!参数初始值设定项不是在调用站点计算的,而是在被调用函数的作用域内计算的。在这种情况下,x
标识符被解析为全局x
多变的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)