1

如果我浏览到 about:blank,请打开脚本控制台并输入以下内容:

var x = function() {
    console.info(this.toString() + ' -- ' + arguments.length.toString());
};
x.bind;

响应显示 x.bind 是在本机代码中实现的:

function bind() { [native code] }

但是,当我在我的 Web 应用程序的页面上拉起脚本控制台并执行相同的语句时,看起来 x.bind 不是本机实现的:

function (a){var b=this;return function(){b.apply(a,arguments)}}

什么会导致这个实现像这样切换?我在我的 javascript 中设置的东西可能会导致这种情况吗?我在页面上使用 jQuery - 这会产生影响吗?

4

1 回答 1

4

不是 jQuery,而是其他一些库/脚本添加bindFunction.prototype. 我假设您必须在页面上使用其他脚本(除了 jQuery),并且其他脚本(无论是 jQuery 插件还是其他)在没有检查的情况下被覆盖。

我刚刚在 Chrome 中进行了测试,无论我是否加载了 jQuery,从查看函数bind属性的实际页面中都会显示本机代码标记。(相比之下,如果我加载最新的原型,它会用自己的覆盖 Chrome 的本机版本。)

没有库的页面示例,在 Chrome 上输出:

未加载原型
未加载 jQuery
function bind() { [native code] }

Example with page with latest jQuery, output on Chrome:

Prototype not loaded
jQuery found: 1.6.2
function bind() { [native code] }

Example with page with latest Prototype, output on Chrome:

Prototype found: 1.7
jQuery not loaded
function bind(context) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; var __method = this, args = slice.call(arguments, 1); return function() { var a = merge(args, arguments); return __method.apply(context, a); } }

From your example, you're not loading the latest Prototype, but something is overwriting Function.prototype.bind.

于 2011-07-05T17:34:07.897 回答