f.apply(null,arguments)和f(arguments)

时间:2017-09-14 10:35:49

标签: javascript eloquent

这是eloquentjavascript中的代码:

function transparentWrapping(f) {
  return function() {
    return f.apply(null, arguments);
  };
}

这是我的代码。我没有使用apply方法:

function myTransparentWrapping(f) {
  return function() {//don't use apply
    return f(arguments);
  };
}

两者有什么区别?

改变角度,是否可以说f(参数)和null.f(参数)之间的区别。

2 个答案:

答案 0 :(得分:1)

apply()方法调用具有给定值的函数,并将参数作为数组提供。 请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

因此,您的第一个函数将返回一个函数,该函数可以在以后使用提供给它的参数执行。 例如:

function add(x, y){ return x + y }
var functionX = transparentWrapping(add);
functionX(1, 2) // this will output 3

第二个函数将立即调用传递的函数,并将参数作为类数组对象(参数)提供给它。在前面的示例中,您的f将被调用为f([1, 2]),这意味着您的x是[1,2]并且您的y未定义。 (x + y = [object Arguments] undefined)

function add(x, y){ return x + y }
var functionY = myTransparentWrapping(add);
functionY(1, 2) // will return [object Arguments]undefined 

答案 1 :(得分:0)

在您自己的实施中

function myTransparentWrapping(f) {
  return function() {//don't use apply
    return f(arguments);
  };
}

您将arguments作为参数传递给f函数。但arguments是一个类似数组的对象(MDN: Arguments object)。您实际需要的是使用扩展运算符(MDN: Spread syntax)。所以你自己的实现应该是这样的:

function myTransparentWrapping(f) {
  return function() {//don't use apply
    return f(...arguments);
  };
}