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

时间:2014-03-20 11:39:36

标签: javascript

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

function staticFunc() {
  dynamicFunc();
}

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

test();

但它给了我错误dynamicFunc is not defined

我知道,如果我在staticFunc中对test()进行硬编码,则可行。我还注意到,当我调用staticFunc时,我只收到错误,而不是在我定义它时(即使dynamicFunc尚未定义),这使得staticFunc似乎在内部运行test()的范围,但显然不是。

有什么办法吗?我能想到的唯一方法是创建一个全局函数funcPtr,它被赋值给我的动态函数。

2 个答案:

答案 0 :(得分:2)

关闭是您可以在子级别范围中使用父级别范围的变量。在你的情况下反过来你已经在子级别范围内初始化一个函数,并尝试在父范围内调用它,这是不正确的。

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

Here is Demo

function staticFunc(dynamicFunc) {
  dynamicFunc();
}

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

test();

答案 1 :(得分:1)

试试这个:

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

考虑到您无法更改 static 函数的任何内容,解决方案会将dynamicFunc的声明更改为包含函数的var。

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

var dynamicFunc = function() {};

Fiddle