75

我试图调查 jQuery 代码,所以我使用了这个:

document.write($.constructor);

jsfiddle

我得到了这个结果:

function Function() { [native code] }

是什么[native code]意思?为什么我看不到真正的代码?

经测试Google-Chrome

4

3 回答 3

58

当您在解释语言(而不是编译语言)中定义函数时。您可以访问定义函数的文件/字符串/文本。

例如,在 JavaScript 中,您可以读取已定义函数的定义正文。

如果您尝试对JavaScript 构造中包含的函数执行相同操作,则它不会以文本形式实现,而是以二进制形式实现。没有理由显示实现该功能的二进制代码,因为它不可读,甚至可能不可用。

jQuery 扩展了默认的 JavaScript 行为。这是它受到高度赞赏和赞扬的原因之一,而不是例如 Prototype.js。Prototype改变了 JavaScript 的自然行为,在将 Prototype 与其他一些依赖于正常功能的代码一起使用时,可能会产生不一致。

tl;博士:

jQuery 扩展了 JavaScript,使用本机代码实现了一些功能(这在性能方面是一件好事)。

于 2012-06-27T21:00:09.783 回答
25

$,jQuery只是一个函数。不调用它,它只是一个普通的函数。函数的构造函数是Function,因此$.constructor显示[native code]

于 2012-06-27T20:59:35.613 回答
1

bind 对函数执行此操作:

var f = function() { /* source code */ };
console.log(f.toString());
function () { /* source code */ }
var a = {};
f = f.bind(a);
console.log(f.toString());
function () { [native code] }
f = new Function('/* source code */');
console.log(f.toString());
function anonymous() { /* source code */ }
f = f.bind(a);
console.log(f.toString());
function () { [native code] }

bind 要么返回对某种包装器代码的引用,要么 toString 认为绑定的副本是本地的,因为它不是由用户直接创建的

但是,直接记录函数,不使用 toString(),打印(在 Chrome 中)原始未绑定函数的源代码:

f = f.bind(a);
console.log(f)
ƒ () { /* source code */ }

在 FF 中这不起作用 - FF 打印函数对象,没有源代码

于 2021-08-16T11:02:08.493 回答