Javascript闭包:动态定义函数,从当前作用域调用方法

Javascript closure: dynamically-defined functions, call method from current scope

本文关键字:作用域 调用 方法 闭包 动态 定义 函数 Javascript      更新时间:2023-09-26

是否可能有一个静态函数调用一个动态定义的函数?我需要这个,因为我不能改变静态函数,我只知道它调用了动态函数。例如:

function staticFunc() {
  dynamicFunc();
}
function test() {
  function dynamicFunc() {console.log('yay');}
  staticFunc();
};
test();

但是它给了我错误dynamicFunc is not defined

我知道,如果我硬编码staticFunctest(),它的工作。我还注意到,我只得到错误时,我调用staticFunc,而不是当我定义它(即使dynamicFunc还没有定义),这使得它看起来像staticFunc运行在test()的范围内,但显然不是。

有什么办法吗?我能想到的唯一方法是使一个全局函数funcPtr被分配给我的动态函数。

闭包是你可以在子级范围内使用父级范围的变量。在你的情况下,它是相反的,你在子级作用域中初始化一个函数,并试图在父级作用域中调用它,这是不正确的。

您可以将当前函数作为参数传递并调用它:

这里是Demo

function staticFunc(dynamicFunc) {
  dynamicFunc();
}
function test() {
  var dynamicFunc = function() {console.log('yay');}
  staticFunc(dynamicFunc);
};
test();

试试这个:

var dynamicFunc = null;
function test() {
    dynamicFunc = function () {console.log('yay');}
    staticFunc();
};

考虑到你不能改变你的静态函数的任何内容,解决方案将dynamicFunc的声明更改为一个包含函数的var。

如果静态函数在调用null时试图调用dynamicFunc,则会抛出异常。但是你可以这样声明:

var dynamicFunc = function() {};

小提琴。