const foo = () => 'foo!';
const doAThing = (
foo = foo
) => {
console.log(foo)
}
doAThing();
给出以下内容:
/private/var/folders/xp/n5tbdrrs761ck82qqychcf61ptmq9d/T/CodeRunner/Untitled.js:4
foo = foo
^
ReferenceError: foo is not defined
at doAThing (/private/var/folders/xp/n5tbdrrs761ck82qqychcf61ptmq9d/T/CodeRunner/Untitled.js:4:8)
at Object.<anonymous> (/private/var/folders/xp/n5tbdrrs761ck82qqychcf61ptmq9d/T/CodeRunner/Untitled.js:9:1)
at Module._compile (module.js:571:32)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.runMain (module.js:605:10)
at run (bootstrap_node.js:423:7)
at startup (bootstrap_node.js:147:9)
(如果我将它设为_foo = foo
那么它就可以了。)
为什么我的例子中没有定义foo?
答案 0 :(得分:6)
为什么我的例子中没有定义foo?
评估参数定义会创建一个定义参数的新范围。这允许您引用默认值中的参数,例如
function foo(x, y=x) {
console.log(x, y);
}
foo(42);
&#13;
正因为如此,foo
中的第二个foo=foo
实际上是指参数 foo
本身。它会影响&#34;外部&#34; foo
。但此时您无法引用foo
因为它尚未初始化。
将其视为与
相同let x = x;
答案 1 :(得分:2)
const foo = () => 'foo!'; //1
//2
const doAThing = ( //3
foo = foo //4
) => { //5
console.log(foo) //6
} //7
doAThing();
在第3行,你写foo = foo
。在这里,您尝试声明一个变量,并在声明它之前使用该变量。因为您为参数指定了名称foo
,所以当您编写foo = foo
时,它会尝试引用自己。该作业的右侧不是您在其上方声明的函数foo
。要解决此问题,请更改参数名称。
const foo = () => 'foo!'; //1
//2
const doAThing = ( //3
func = foo //4
) => { //5
console.log(func) //6
} //7
doAThing(); // -> () => 'foo!'