如何在引擎盖下执行'apply'方法?

问题描述 投票:-1回答:2

我还没有理解Javascript中的apply方法。根据我的理解,apply中的第一个参数将是关键字this的期望值,而额外参数将应用于apply borrowed的函数。我仍然不确定这种方法是如何应用于引擎盖下的。结果怎么样[1,2,3,4,5,6,7,8]

var flattenedArray = [[1,2],[3,4,5,6], 7, 8]
[].concat.apply([],flattenedArray) 

请问有人可以帮我解决这个问题。谢谢

javascript methods apply
2个回答
0
投票

结果[1, 2, 3, 4, 5, 6, 7, 8]不是Function#apply的值,而是函数Array#concat

apply仅在显式绑定的上下文中调用该函数,并可选择将参数作为数组,将其传递给函数。

当你将[[1,2],[3,4,5,6], 7, 8]传递给函数apply时,它获取内部项(保持内部项的外部被认为是apply的第二个参数的类型,这是一个数组,所以为什么它逐个获取内部项省略外部数组)[1,2][3,4,5,6]78到函数concat。

查看示例。以下两个concat调用是相同的。

const flattenedArray = [[1,2],[3,4,5,6], 7, 8];

const first = [].concat.apply([],flattenedArray);
console.log(first);

const second = [].concat([1,2], [3,4,5,6], 7, 8);
console.log(second);

0
投票
var flattenedArray = [[1,2],[3,4,5,6], 7, 8]
[].concat.apply([],flattenedArray) 

                        // [].concat.apply([],flattenedArray) 
var concat = [].concat  // ^^^^^^^^^
var me = []             //                 ^^

                        // [[1,2],[3,4,5,6], 7, 8]
var arg0 = [1,2]        //  ^^^^^
var arg1 = [3,4,5,6]    //        ^^^^^^^^^
var arg2 = 7            //                   ^
var arg3 = 8            //                      ^

me.concat = concat
var res = me.concat(arg0, arg1, arg2, arg3)
delete me.concat

console.log(res)

function concat(...args) {
  var res = []
  
  for (var x of this) {
    res.push(x)
  }
  
  for (var arg of args) {
    if (arg instanceof Array) {
      for (var x of arg) {
        res.push(x)
      }
    } else {
      res.push(arg)
    }
  }
  
  return res
}

console.log(concat.apply([], [[1,2], [3,4,5,6], 7, 8]))
© www.soinside.com 2019 - 2024. All rights reserved.