我的问题很简单但我不知道我是否遗漏了什么。
为什么甚至需要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);
答案 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
期望一个数组时,我会撒谎。当然,它很好,但如果你给它一个类似数组的对象,它也不会哭泣
function theHiddenTruthBehindArguments() {
console.log(arguments)
console.log(arguments.length)
}
theHiddenTruthBehindArguments(0,1,'abc')
// {"0":0,"1":1,"2":"abc"}
// 3
&#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
}
}