为其他 IIFES 创建一个 IIFE return 变量
Make an IIFE return variables for only some other IIFES
我想知道我们是否可以在一个 IIFE 和 return 中声明一个变量,但使其可用于另一个特定的 IIFE?这是一个例子!
所以我有
const iife1 = (()=>{
const x = 10;
return x
})()
const iife2 = (()=>{/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */})()
const iife3 = (()=>{/* HERE X CANNOT BE CALLED */})()
也许你会说只是不要将 iif3 中的变量 x 作为参数传递,但我想知道当 return 从 iif1 中获取变量时是否有条件的方法可以实现它,所以iif1 会在 return 实际 returned 之前知道其属性或方法的功能!
我的目标是创建一个 IIFE,我将在其中声明我将在我的项目中使用的所有变量。然后对于每个变量,我想有一个适当的条件,以便当带有变量 returns 的 IIFE 函数已经决定在哪个范围内发送变量以供使用!我不知道这种方法是否有意义,但正如人们常说的那样,我尽量不填充全局范围。
IIFEs 只能使用 Global
、Passed
或内部变量。您不能使某些功能对同一范围内的第二个函数不可用的功能范围可用。
传递变量是一种方法,但在某些情况下更实用的方法可能是根据需要嵌套 IIFE
const iife2 = (() => {
const iife1 = (() => {
const x = 10;
return x
})()
console.log(iife1);
/*iife2 scope*/
})()
const iife3 = (() => { /* HERE X CANNOT BE CALLED */ })()
没有必要使用三个 IIFE,请记住,只要您的 iife1
returns 该值将在 iife2
和 iife3
的相同范围内这样你就达不到目标了。
你最好的选择是将 iife2
和 iife3
声明为普通函数,并在满足某些条件时在 iife1
中调用它们,并传递将创建范围的变量 iife3
作为参数。
此解决方案比依赖外部作用域更灵活、更可预测
const fn2 = function(x) {/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */};
const fn3 = function() {/* HERE X CANNOT BE CALLED */};
(()=>{
const x = 10;
//your logic
fn2(x);
fn3();
})()
实现这一目标的(可能有十几种)方法之一是使用 Proxy
。
第一个 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);
Fiddle:
https://jsfiddle.net/ay92L1r6/6/
我想知道我们是否可以在一个 IIFE 和 return 中声明一个变量,但使其可用于另一个特定的 IIFE?这是一个例子!
所以我有
const iife1 = (()=>{
const x = 10;
return x
})()
const iife2 = (()=>{/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */})()
const iife3 = (()=>{/* HERE X CANNOT BE CALLED */})()
也许你会说只是不要将 iif3 中的变量 x 作为参数传递,但我想知道当 return 从 iif1 中获取变量时是否有条件的方法可以实现它,所以iif1 会在 return 实际 returned 之前知道其属性或方法的功能!
我的目标是创建一个 IIFE,我将在其中声明我将在我的项目中使用的所有变量。然后对于每个变量,我想有一个适当的条件,以便当带有变量 returns 的 IIFE 函数已经决定在哪个范围内发送变量以供使用!我不知道这种方法是否有意义,但正如人们常说的那样,我尽量不填充全局范围。
IIFEs 只能使用 Global
、Passed
或内部变量。您不能使某些功能对同一范围内的第二个函数不可用的功能范围可用。
传递变量是一种方法,但在某些情况下更实用的方法可能是根据需要嵌套 IIFE
const iife2 = (() => {
const iife1 = (() => {
const x = 10;
return x
})()
console.log(iife1);
/*iife2 scope*/
})()
const iife3 = (() => { /* HERE X CANNOT BE CALLED */ })()
没有必要使用三个 IIFE,请记住,只要您的 iife1
returns 该值将在 iife2
和 iife3
的相同范围内这样你就达不到目标了。
你最好的选择是将 iife2
和 iife3
声明为普通函数,并在满足某些条件时在 iife1
中调用它们,并传递将创建范围的变量 iife3
作为参数。
此解决方案比依赖外部作用域更灵活、更可预测
const fn2 = function(x) {/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */};
const fn3 = function() {/* HERE X CANNOT BE CALLED */};
(()=>{
const x = 10;
//your logic
fn2(x);
fn3();
})()
实现这一目标的(可能有十几种)方法之一是使用 Proxy
。
第一个 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);
Fiddle: https://jsfiddle.net/ay92L1r6/6/