javascript – Function.apply与Function.prototype.apply

前端之家收集整理的这篇文章主要介绍了javascript – Function.apply与Function.prototype.apply前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

只要我理解这会导致调用Function.apply,它引用x.log并且参数是x和arguments.由于Function.apply本身调用函数,因此将调用x.log,其引用x和arguments作为其参数.

这引出了我的问题:有没有理由以这种方式调用Function.apply而不是仅使用Function.prototype.apply?或者换句话说,上面和返回x.log.apply(x,参数)之间有什么区别吗?

编辑:由于它是开源的,我快速查看了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 +
            ",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);

我现在几乎可以肯定,这与函数处于不同的范围有关,这是我在第一次评论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 */);

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

原文链接:https://www.f2er.com/js/429701.html

猜你在找的JavaScript相关文章