这个高阶命令功能有什么作用?

时间:2016-08-01 23:18:58

标签: javascript functional-programming

我的问题很简单但我不知道我是否遗漏了什么。

为什么甚至需要Arr原型切片调用?

为什么它甚至需要,因为你可以运行函数只是为args变量赋值。我知道它是一个类似数组但它没有来自它的方法

为什么arguments === func是假的?

func.apply(null, args)如何运作?

function logAndReturn(func) {  
  return function() {  
    var args = Array.prototype.slice.call(arguments);
    var result = func.apply(null, args);
    console.log('Result', result);
    return result;
  }
}
var addAndLog = logAndReturn(add);

1 个答案:

答案 0 :(得分:0)

您提出了很多问题,其中大多数都是重复的。但是,我知道有时很难拼凑出许多不同的答案来找到你自己问题的答案。在将来,您应该避免在帖子中询问更多问题。这会让一些人不那么生气。

我会在内联代码中添加一些注释

function logAndReturn(func) { // <------------┐ 
  return function() { // <------------------┐ |
    // `arguments` belongs to this function-┘ |
    // NOT this one --------------------------┘
    var args = Array.prototype.slice.call(arguments);

    // `apply` expects an array but `arguments` is an object
    // we call `slice` on `arguments` so that it can be converted to an array
    var result = func.apply(null, args);

    console.log('Result', result);
    return result;
  }
}
var addAndLog = logAndReturn(add);

实际上,JavaScript比这更宽容。它不是一种打字语言,所以当我说apply 期望一个数组时,我会撒谎。当然,它很好,但如果你给它一个类似数组的对象,它也不会哭泣

&#13;
&#13;
function theHiddenTruthBehindArguments() {
  console.log(arguments)
  console.log(arguments.length)
}

theHiddenTruthBehindArguments(0,1,'abc')
// {"0":0,"1":1,"2":"abc"}
// 3
&#13;
&#13;
&#13;

arguments实际上是一个类似数组的对象。它具有顺序数字键(以0开头)和length属性,它是处理任何对象(如数组)所需的所有信息。

所以这实际上可行

function logAndReturn(func) {
  return function() {
    // this works too !
    var result = func.apply(null, arguments);
    console.log('Result', result);
    return result;
  }
}
var addAndLog = logAndReturn(add);

要回答你的上一个问题,apply以一种非常简单的方式进行...

let args = [1,3,4]
func.apply(null, args)

...(大部分)和......一样......

func(1,3,4)

你可以阅读这个问题。您可能需要了解一些细节。

你给的那个功能可以在ES6中更好地表达,我认为它会让你更加困惑

function logAndReturn(func) {

  // rest parameter ...args is the new way to express variadic functions
  // (functions that take a variable number of arguments)
  // all arguments given will be collected in a single `args` array
  return function(...args) {

    // spread syntax will expand the array to call `func`
    // with all of the collected args
    var result = func(...args)

    console.log('Result', result)
    return result
  }
}