我想知道是否有一种方法可以区分JavaScript脚本函数(function(){})和JavaScript native 函数(Math.cos)。
我已经知道func.toString().indexOf('[native code]') != -1技巧了,但是我想知道是否还有另一种方法可以检测到它。

语境:
我需要创建一个No-op转发ES6代理,该代理可以处理对象上的 native 功能,但是它失败并显示TypeError: Illegal invocation(请参阅Illegal invocation error using ES6 Proxy and node.js)。

要解决此问题,我在代理的.bind()处理程序中对所有函数进行了get编码,但是如果我可以有效地检测 native 函数,则只需对这些 native 函数.bind()编码。

更多详细信息:https://github.com/FranckFreiburger/module-invalidate/blob/master/index.js#L106

笔记:

(function() {}).toString() -> "function () {}"
(function() {}).prototype  -> {}

(require('os').cpus).toString() -> "function getCPUs() { [native code] }"
(require('os').cpus).prototype  -> getCPUs {}

(Math.cos).toString() -> "function cos() { [native code] }"
(Math.cos).prototype  -> undefined

(Promise.resolve().then).toString() -> "function then() { [native code] }"
(Promise.resolve().then).prototype  -> undefined

编辑:
目前,最好的解决方案是测试!('prototype' in fun),但不适用于require('os').cpus ...

最佳答案

您可以 try Function 构造函数与函数的 toString 值一起使用。如果它没有引发错误,那么您将获得一个自定义函数,否则您将获得一个 native 函数。

function isNativeFn(fn) {
    try {
        void new Function(fn.toString());
    } catch (e) {
        return true;
    }
    return false;
}

function customFn() { var foo; }

console.log(isNativeFn(Math.cos));          // true
console.log(isNativeFn(customFn));          // false
console.log(isNativeFn(customFn.bind({}))); // true, because bind 

关于javascript - 如何确定JavaScript函数是本地的(不测试 '[native code]'),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42594682/

10-11 19:48
查看更多