gpt4 book ai didi

javascript - 是否可以通过编程方式检测关闭?

转载 作者:行者123 更新时间:2023-11-28 08:44:02 25 4
gpt4 key购买 nike

我有一个允许用户传递函数的函数。

function withPredicate(func){
//...
}

在我的函数中,我需要检测用户传入的函数是否有闭包。

获取函数名称并在窗口范围内搜索它是不够的。用户可能会传入一个不带闭包的匿名函数,例如:

var func = function(x){return x;};
withPredicate(func);

编辑:

我认为我需要实现一个函数,该函数将函数作为参数并返回 bool。

function hasClosure(func){
//...
}

所以几个测试用例是:

hasClosure(function(x){return x;}); //return false

var something = 30;
var func1 = function(x){return x.age < something;}
hasClosure(func1); //return false

var Closure = function(){
var something = 18;
var itself = function(x){
return x.age < something;
};
return itself;
};

var func2 = new Closure();
hasClosure(func2); //return true

最后一个返回 true,因为 func2 不是顶级函数。当我在函数体内看到一些自由变量(例如 something)时,它可能会解析为闭包中定义的变量,而不是 window.

实际上,我现在需要做的是根据已传递给我的函数的 func 进行一些操作。我可以使用 JSLint 来获取未声明的变量。但我还需要解决这些变量。我只能解析全局范围内的变量,这是可以接受的。但我仍然需要一种方法来确保在全局范围内解析这些变量是正确的。所以我需要检测关闭。

是否可以在 JavaScript 中以编程方式执行此操作?

最佳答案

好吧,这真的很糟糕,可能不值得在实际编写中付出努力,除非你的代码检查或其他东西:)

基本上,要确定函数是否是闭包,您需要调用 func.toString() ,这将为您提供函数的源代码。然后,您可以使用某种解析器解析该函数​​,该解析器确定函数 func 的所有变量。您还需要确定并跟踪这些变量的定义方式。在 op 的标准中,它作为闭包的标准是具有在函数范围之外和窗口范围之外定义的变量(因此是闭包范围)。因此,如果您可以找到在这两个范围之外定义的任何变量,我们就找到了闭包。

这是hasClosure()的伪代码,祝大家实现愉快。

func hasClosure(func)
source = func.toString(); //eg "function x(a) {return new Array(a)}"
variables = parseJSForVariables(source)//finds a and Array
for variable in variables:
if(variable not in window)
if(variable not defined in function)
return true //we got a closure
return false //not a closure

关于javascript - 是否可以通过编程方式检测关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com