gpt4 book ai didi

javascript - Function.apply 与 Function.prototype.apply

转载 作者:搜寻专家 更新时间:2023-11-01 04:18:41 27 4
gpt4 key购买 nike

我最近通过调用 console.log.toString() 查看了 firebugs console.log 的代码并得到了这个:

function () { return Function.apply.call(x.log, x, arguments); }

据我所知,这会导致 Function.apply 被调用,其 this 引用 x.log 并且参数为 x参数。由于 Function.apply 本身调用函数,这将导致 x.log 被调用,其 this 引用 xarguments 作为它的参数。

这引出了我的问题:是否有任何理由以这种方式调用 Function.apply 而不是仅仅使用 Function.prototype.apply?或者换句话说,上面的和return x.log.apply(x, arguments)有什么区别吗?

编辑:因为它是开源的,所以我快速查看了 firebug 源代码并找到了它的创建位置(consoleInjector.js,第 73 行):

// Construct a script string that defines a function. This function returns
// an object that wraps every 'console' method. This function will be evaluated
// in a window content sandbox and return a wrapper for the 'console' object.
// Note that this wrapper appends an additional frame that shouldn't be displayed
// to the user.
var expr = "(function(x) { return {\n";
for (var p in console)
{
var func = console[p];
if (typeof(func) == "function")
{
expr += p + ": function() { return Function.apply.call(x." + p +
", x, arguments); },\n";
}
}
expr += "};})";

// Evaluate the function in the window sandbox/scope and execute. The return value
// is a wrapper for the 'console' object.
var sandbox = Cu.Sandbox(win);
var getConsoleWrapper = Cu.evalInSandbox(expr, sandbox);
win.wrappedJSObject.console = getConsoleWrapper(console);

现在我几乎可以肯定这与 Function 处于不同的范围有关,这就是我在对 pst 的第一条评论中所说的的答案,但我仍然没有完全理解它。我可能会对此做进一步的研究。

最佳答案

考虑一下:

Function.hasOwnProperty("apply")             // false
Function.apply == Function.prototype.apply // true
Function.__proto__ == Function.prototype // true in FF which exposes proto

所以 Function.apply 有效是因为 Function 的 [[prototype]] 是 Function.prototype .在这种情况下,两者都应该按预期工作。

但是,请考虑正常 [GetProperty]规则仍然适用:

var f = function () {};
f.apply = "nubbits";
f.apply(/* err */);

当然,我认为它是“有问题的代码”来改变 apply 的行为(尤其是以不兼容的方式),但是可能这两种形式不同.. 就个人而言,我适应这种假设情况,我在我的代码中使用 f.apply

关于javascript - Function.apply 与 Function.prototype.apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14863171/

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