gpt4 book ai didi

javascript - 有什么理由让函数假装是原生的吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:55:29 28 4
gpt4 key购买 nike

在 JavaScript 中,当强制转换为字符串时可以识别原生函数,例如:

console.log(document.getElementById);
// prints "function getElementById() { [native code] }"

但是,任何函数都可以重载 toString() 并伪装成原生函数:

function sum(a, b) {
return a + b;
}

console.log(sum);
// prints "function sum(a, b) { return a + b; }"

sum.toString = function() { return 'function sum() { [native code] }'; };
console.log(sum);
// now prints "function sum() { [native code] }"

我正在查看 Zone.js 的源代码并找到this bit ,它正是这样做的(并且通过设计,according to one of the tests):

class ZoneAwarePromise<R> implements Promise<R> {
static toString() {
return 'function ZoneAwarePromise() { [native code] }';
}

...

现在,我不是要猜测为什么 Zone.js 团队特别选择这样做(我找不到任何官方博客文章/解释),而是:

  • 一般来说,您想在什么时候做这件事?这样做有什么好处吗?

  • 它有任何副作用吗,即 JavaScript 标准或任何 JavaScript 引擎是否以不同方式处理这些函数?

最佳答案

您正在检查的代码特定于 Chromium 引擎和 MS Edge。

function eval() { [native code] }

在 Firefox 和 Safari 中,相同函数的字符串表示形式类似于:

function eval() {
[native code]
}

在 Internet Explorer 中,字符串表示类似,只是字符串的开头和结尾也有换行符。

因此,如果该代码应该伪造一个本地函数,至少它做得不好(或者它可能是 Node 特定的?)。

我不知道这有什么实际用途,除了移植 JSFuck跨浏览器。

确定函数是否为 native 函数的更安全方法是获取 Function.prototype.toString.call(fn) 的结果(其中 fn 是被测试的函数) 并在预期位置搜索字符串 [native code]。这在所有浏览器中都是不变的,尽管据我所知,它还没有按照规范做到这一点。

关于javascript - 有什么理由让函数假装是原生的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41961916/

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