创建JS函数并指定其范围



在写一些关于作用域和闭包的JS时,我突然想到了一个非常简单的问题。(请耐心听我举一个相当复杂的例子。(

假设我有两个函数,其中一个或多或少是一个名为"的装饰器;makeMagicFn";。这个东西接收一个对象,在它上面查找randomFn方法,并对它做一些很酷的事情,将它作为属性附加到一个新对象someSpecialFn,返回该对象。

第二个功能是魔法发生的地方。它内部有几个局部变量,然后定义";"随机";用于在上述CCD_ 3中使用的函数。

这是有趣的部分。这里定义为innerFnrandomFn查找在outerFn的作用域(foobaz(上定义的变量,并对它们执行一些操作。最后,从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一样,只是不在outerFnthis上设置上下文,而是将其放在内存中。

不,这是不可能的。局部变量是局部的,范围是词法的。要在它们之上创建闭包,必须定义它们在作用域中的函数。

如果你不让foobaz成为局部变量,而是让它们成为对象的属性,那么你可以做很多把戏,然后你可以传递这些属性(在最简单的情况下,作为makeMagicFn的参数(。

最新更新