gpt4 book ai didi

Javascript : is given function empty?

转载 作者:可可西里 更新时间:2023-11-01 01:23:47 27 4
gpt4 key购买 nike

让我们调用一个函数

function doSomethingAndInvokeCallback(callback){
// do something
callback();
}

我可以检查给定的参数是否是函数 if(typeof callback == 'function')

我如何发现给定的回调函数是否为函数且不为空?

喜欢

doSomethingAndInvokeCallback(function(){
//nothing here
})

最佳答案

没有完全可靠的方法知道一个函数是否为空,因为 JS 中有多种函数,有些是用 JS 实现的,有些是用 native 代码实现的,你无法确定传入的函数是否为空有没有。如果您想将传入的函数限制为仅非常简单的 JS 函数,您可以使用此处其他答案概述的机制(检查函数的来源)。但是,除了在严格控制的情况下,我不建议这样做,因为有很多合法的 javascript 方法可以打破它。

我建议您应该更改函数参数的约定,让调用者传递 null 或不传递任何内容(这将使参数 undefined)而不是空函数。然后,他们是否打算调用一个函数就很清楚了。如果他们随后传递一个空函数而不是 null 或 undefined,他们将获得函数接口(interface)指定的行为。调用者可以选择所需的行为,您可以以更安全的方式实现您的功能。

此外,您在问题中的主要假设之一不太正确。您不能安全地使用 typeof x == "function" 来确定某物是否是一个函数,因为对于某些类型的函数,在某些旧版本的 IE 中不能可靠地工作。如果您想了解如何检测某个东西是否是一个函数,您可以在此处学习 jQuery(即使您没有使用它)。 jQuery 有一个它一直在内部使用的函数,称为 jQuery.isFunction(),它返回一个 bool 值。它主要用于测试参数以查看是否传递了函数。

在内部,它调用:

Object.prototype.toString.call(o)

然后检查结果。如果结果中有“Function”,则测试测试参数是一个函数。

因此,使用 jQuery 中使用的相同技术,您可以构建自己的简单小 isFunction 例程,如下所示:

function isFunction(test) {
return(Object.prototype.toString.call(test).indexOf("Function") > -1);
}

当然,如果你有可用的 jQuery,你可以只使用它自己的版本:

jQuery.isFunction(o)

当存在潜在的跨浏览器兼容性问题时,我发现查看一个大型库如何解决问题是有指导意义的,即使您不打算使用该库也是如此。您可以确定这些库已经针对许多浏览器进行了审查,因此他们使用的技术是安全的。有时您必须解开他们自己的所有内部例程,他们可能会使用这些例程来弄清楚他们真正在做什么(这个函数就是这种情况),但您可以节省大量的跑腿工作。

你可以在这里看到一个工作测试台:http://jsfiddle.net/jfriend00/PKcsM/

在现代浏览器中 typeof fn === "function",但在旧版本的 IE 中,一些函数给出一个 typeof === "object" 这可能是为什么 jQuery 使用在那些旧版本的 IE 中工作的其他方法。

关于Javascript : is given function empty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960335/

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