我是JS的新手,我试图遵循作用域对子对象/函数的作用。
例如:
const b = {
c: () => {
console.log("C", foo)
}
}
const x = (foo) => {
console.log("X", foo)
return {
a: () => {
console.log("A", foo)
},
b: b
}
}
i = x("FOO")
i.a()
b.c()
我希望在所有3种情况下都能看到输出FOO
-但是我实际上看到了:
X FOO
FOO
未捕获的ReferenceError:在Object.c中未定义foo
我正在尝试创建一个函数,该函数的所有方法实际上都映射到外部/导入的方法,但是由于所有这些都需要访问foo
,因此无法正常工作。 b
(c
)是否可以访问foo
?还是处理这种情况的另一种方法?
答案 0 :(得分:1)
您需要在b
函数中创建x
,以便它可以访问参数值foo
-否则不在范围内。如果必须从其他位置导入b
,则需要更改另一个模块以导出函数,以便可以提供foo
来创建b
:
function makeB(foo) {
// `foo` is in scope here
return {
c() {
console.log("C", foo)
}
};
}
function x(foo) {
// `foo` is in scope here
console.log("X", foo)
return {
a() {
console.log("A", foo)
},
b: makeB(foo),
};
}
const i = x("FOO");
i.a();
i.b.c();
答案 1 :(得分:0)
在函数x的返回对象内移动b的定义
const x = (foo) => {
console.log("X", foo)
return {
a: () => {
console.log("A", foo)
},
b: {
c: () => {
console.log("C", foo)
}
}
}
}
由于关闭,您现在将可以访问foo。