有没有办法使用.bind或.apply来为被调用的方法提供调用方法或循环的范围?

时间:2016-01-11 04:34:54

标签: javascript asynchronous scope bind apply

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);
}

为了整洁,我既不想在瀑布中定义我的所有函数,也不想玩各种复杂的游戏,传递包含值的对象,以便这些方法可以访问它们,但我和#39;我不清楚如何(或是否)可以使用bindapply来使这些外部定义的方法可以访问itemA,或者是否有class XYZ(ModelView): column_list = ['id', 'selection'] column_filters = ['selection'] 我不熟悉的一些其他机制可以使这成为可能。

1 个答案:

答案 0 :(得分:3)

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

然而,当您调用它时,您可以简单地将itemA作为参数传递给outerFunction。这是解决这类问题的通常和预期的方法。

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

  

但我不清楚如何(或者是否)可以使用bind或apply   给这些外部定义的方法访问itemA或者如果有的话   我不熟悉的其他一些机制可以做到这一点   可能的。

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