代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

有没有什么方法可以使用.bind或.apply来给被调用的方法提供调用方法或循环的范围?

  •  1
  • Yevgeny Simkin  · 技术社区  · 10 年前
    function foo(itemA) {
      async.waterfall(
        [
          function(callback) {
            console.log("I can see itemA as " + itemA); // <-- this works fine
            callback(null);
          },
          outerFunction // <-- this method doesn't have access to itemA
        ],
        function(err, item) {}
      );
    }
    
    function outerFunction(callback) {
      //item A is not defined so this barfs
      console.log("I'm going to throw an exception cause... " + itemA);
    }
    

    为了简洁起见,我既不想在瀑布中定义所有函数,也不想在包含值的对象周围玩各种复杂的游戏,以便这些方法可以访问它们,但我不清楚如何(或是否)使用 bind apply 为这些外部定义的方法提供访问 itemA 或者如果有我不熟悉的其他机制可以实现这一点。

    1 回复  |  直到 10 年前
        1
  •  3
  •   jfriend00    10 年前

    不。Javascript中的范围是词法的(基于代码的位置)。不能更改已声明的函数的范围。

    然而,你可以简单地通过 itemA outerFunction 当你调用它时,作为一个论点。这是解决这样一个问题的通常和预期的方法。

    还有其他技术可以让事物更自动地访问一组变量,比如将值分配给更高但共享的范围,或者在一个公共对象上使事物方法都可以共享对实例数据的访问,但从您对问题的描述来看,这两种方法在本例中是否合适并不明显。

    但我不清楚如何(或是否)使用bind或apply to 让这些外部定义的方法访问itemA,或者 其他一些我不熟悉的机制会导致这种情况 可能的

    .bind() .apply() 不以任何方式影响范围。它们使您能够控制 this 和/或函数的参数。如果感兴趣的变量在某个对象上可用,则可以使用 .bind() , .应用() .call() 设置的值 并允许您的函数通过 this.property .

    推荐文章