首页 > 解决方案 > JavaScript 应用()

问题描述

当我分别将数组和对象传递给 function.apply() 时,我得到 NaN 的 o/p,但是当我执行对象和数组时,我得到一个数字。为什么会这样?

由于数组也被视为对象,为什么我不能用它来表示来自同一上下文的数组/

我试过改变变量调用的位置,但我知道顺序只有在它是参数时才重要。

function add() {
  return arr[0] + arr[1] + this.a + this.b;
}
let obj = {
  a: 1,

  b: 2
};

let arr = [1, 2];

console.log(add.apply(arr, obj));
console.log(add.apply(obj, arr));

输出/输出

NaN
6

标签: javascriptarraysfunctionobjectapply

解决方案


也许图表可以提供帮助。您的函数不使用任何参数,因此您在第二个参数中提供的apply内容(应该是一个值数组)并不重要。只有第一个参数(this在函数体中)很重要。

当您调用 with 时arr,然后this指向arr参数中提供的对象,但arr也指向同一个对象,因为它是全局的并且不会在任何地方被覆盖:

function add() {
  //        1     +   1    + undefined + undefined   //=> NaN
    return arr[0] + arr[1] + this.a    + this.b;
} //        |        |         |           |
  // +------+--------+---------+-----------+
  // |                       
  // V                       
let arr = [1, 2];         let obj = {a: 1, b: 2};
  //                           ^
  //                            `-----Nothing points to this

add.apply(arr) // equivalent to `add.apply(arr, obj)`, since `add` ignores parameters

当您调用 with 时obj,然后this指向obj参数中提供的,并arr再次指向全局arr对象:

function add() {
  //         1    +   2    +   1       +    2        //=> 6 
    return arr[0] + arr[1] + this.a    + this.b;
} //        |        |         |           |
  // +------+--------+         +-----------+
  // |                         |   
  // V                         V  
let arr = [1, 2];         let obj = {a: 1, b: 2};

add.apply(obj) // equivalent to `add.apply(obj, arr)`, since `add` ignores parameters


推荐阅读