这是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(参数)之间的区别。
答案 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);
};
}