在写一些关于作用域和闭包的JS时,我突然想到了一个非常简单的问题。(请耐心听我举一个相当复杂的例子。(
假设我有两个函数,其中一个或多或少是一个名为"的装饰器;makeMagicFn";。这个东西接收一个对象,在它上面查找randomFn
方法,并对它做一些很酷的事情,将它作为属性附加到一个新对象someSpecialFn
,返回该对象。
第二个功能是魔法发生的地方。它内部有几个局部变量,然后定义";"随机";用于在上述CCD_ 3中使用的函数。
这是有趣的部分。这里定义为innerFn
的randomFn
查找在outerFn
的作用域(foo
和baz
(上定义的变量,并对它们执行一些操作。最后,从outerFn
返回经过修饰的innerFn
,供其调用者使用。
function makeMagicFn({ randomFn }) {
const someSpecialFn = makeSomethingAwesomeWithRandomFn(fn);
return {someSpecialFn};
}
function outerFn() {
const foo = "bar";
const baz = "qux";
const insideFn = () => {
console.log(foo, baz);
}
const {someSpecialFn} = makeMagicFn({ randomFn: insideFn });
return someSpecialFn;
}
现在是我的问题。
JS是否允许我在outerFn
之外定义innerFn
,以允许访问outerFn
的范围,这样它就可以在不引发___ is not defined
错误的情况下查找变量?(例如,如果我想从一个单独的文件导入它。(就像使用.bind
一样,只是不在outerFn
的this
上设置上下文,而是将其放在内存中。
不,这是不可能的。局部变量是局部的,范围是词法的。要在它们之上创建闭包,必须定义它们在作用域中的函数。
如果你不让foo
和baz
成为局部变量,而是让它们成为对象的属性,那么你可以做很多把戏,然后你可以传递这些属性(在最简单的情况下,作为makeMagicFn
的参数(。