嵌套对象/功能时的作用域

时间:2018-10-05 12:08:46

标签: javascript scoping

我是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,因此无法正常工作。 bc)是否可以访问foo?还是处理这种情况的另一种方法?

2 个答案:

答案 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。