首页 > 解决方案 > 在javascript中传递array.push函数

问题描述

我在 javascript 中传递 array.push 函数时遇到问题,代码如下:

const array = [];
    addToArray("works", (e) => array.push(e));
    addToArray("notWorks", array.push);
    doConsoleLog("hello", console.log);
    
    function addToArray(element, pushFn) {
      pushFn(element);
    }
    
    function doConsoleLog(message, log) {
      log(message);
    }

只是好奇第一次调用 addToArray 是如何工作的,但是第二个原因TypeError: Cannot convert undefined or null to object。这怎么可能?array.push 的类型是一个函数。不能像上面的 console.log 那样直接传递函数,这很好用吗?

标签: javascript

解决方案


push是一种方法array。调用时,它this用作对正在调用它的对象的引用。如果您像普通函数一样传递它,您将丢失该引用,该方法将使用this调用时定义的值(内部addToArraythis可能是document.window),因此将失败。

为了传递一个方法,您需要将它绑定到您希望它操作的对象,在本例中为array. 这适用于 JavaScript 中的任何对象方法。Function.prototype.bind()正是为了这个目的而存在:它将一个函数(在这种情况下是你的方法)“绑定”到一个给定的值this,以便正常工作。

const array = [];

addToArray("now it works", array.push.bind(array));
// or
addToArray("now it works", Array.prototype.push.bind(array));

function addToArray(element, pushFn) {
  pushFn(element);
}

推荐阅读