仅对其他一些IIFES设置IIFE返回变量

时间:2018-11-12 18:20:36

标签: javascript scope iife

我想知道我们是否可以在一个IIFE中声明一个变量并返回它,但可将其提供给另一个特定的IIFE?这是一个例子!

所以我有

const iife1 = (()=>{
const x = 10;
return x
})()

const iife2 = (()=>{/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */})()
const iife3 = (()=>{/* HERE X CANNOT BE CALLED */})()

也许您会说只是不将i变量3中的变量x作为参数传递,但是我想知道从iif1返回变量时是否有条件方式可以实现它,所以iif1会知道针对哪些函数它会在实际返回之前返回其属性或方法!

我的目标是创建一个IIFE,在其中我将声明要在项目中使用的所有变量。然后,对于每个变量,我希望有一个适当的条件,以便当带有变量的IIFE返回时,该函数已经确定了哪个范围将变量发送给使用!我不知道这种方法是否有意义,但正如我经常说的那样,我试图不填充全局范围。

Codepen

3 个答案:

答案 0 :(得分:0)

IIFE 只能使用GlobalPassed或内部变量。您不能使某项功能对某个功能范围不可用,而该功能对同一范围中的第二个功能不可用。

传递变量是一种方法,但是在某些情况下,更实用的方法是根据需要嵌套 IIFE

const iife2 = (() => {
  const iife1 = (() => {
    const x = 10;
    return x
  })()

  console.log(iife1);
/*iife2 scope*/
})()

const iife3 = (() => { /* HERE X CANNOT BE CALLED */ })()

答案 1 :(得分:0)

没有必要使用三个IIFE,请记住,一旦您的iife1返回,该值将在iife2iife3的同一范围内,因此您将无法实现你的目标。

您最好的选择是将iife2iife3声明为普通函数,并在满足某些条件时在iife1中调用它们,并传递将创建{{1 }}作为参数。

此解决方案比依赖外部范围更灵活,更可预测

iife3

答案 2 :(得分:0)

(可能的十几种)方法之一是使用Proxy。 First IIFE将创建一个代理对象,您可以通过该对象访问其属性。调用revoke()之后,您将无法再访问代理的任何道具。

正如人们在评论中指出的那样,可能有很多更简单的方法让您获得想要的结果,但是您并没有清楚地提出实际问题。

const { proxy, revoke } = (() => {
    const x = { test: 'test' };
    const revocable = Proxy.revocable(x, {
        get: (target, name) => name
    });

    return revocable;
})();

const test1 = (proxy => {
    console.log('TEST 1', proxy.test);
})(proxy);

revoke();

const test2 = (proxy => {
    console.log('TEST 2', proxy.test); // can't access
})(proxy);

提琴: https://jsfiddle.net/ay92L1r6/6/