2016-01-11 65 views
1
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); 
} 

为了整洁起见,我既不想在瀑布内定义所有的函数,也不想玩遍各种包含值的对象的各种精细游戏,以便这些方法可以访问它们,但我不清楚如何(或如果)可以使用bindapply来给这些外部定义的方法访问itemA,或者如果有一些我不熟悉的其他机制可以使这成为可能。有没有一些方法可以使用.bind或.apply给调用方法或调用方法的范围?

回答

3

编号在Javascript中的范围是词法(根据代码的位置)。您不能更改已经声明的函数的范围。

然而,您可以简单地通过itemAouterFunction作为参数,当你调用它。这是解决像这样的问题的通常和预期的方式。

还有其他技术可以让更多的东西自动访问一组变量,比如给一个更高但共享的作用域赋值,或者在共享对象上创建所有可以共享对实例数据的访问的方法,但它是从这个问题的描述中看不出这些问题在这种情况下是否合适。

但我不是它如何(或是否)有可能使用绑定或申请 给这些外部定义的方法访问意达明确或存在 一些其他的机制,我不熟悉会使这 成为可能。

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

+0

我有这样的感觉,但希望我能忽略某种方式来做到这一点。正如我的问题所述,我很清楚如何传递价值观并使用它们,就像我多年来一直在做的一样......这让我想起了我可能忽视了一个非常强大的机制,但唉,它会出现我没有。 –

+0

@GeniaS。 - 不通过范围。 Javascript中的范围是基于代码的词法布局 - 而不是你可以用'.bind()'或'.apply()'修改的东西。 – jfriend00

+0

“* Javascript中的范围是词法... *”除[*带有*](http://www.ecma-international.org/ecma-262/6.0/#sec-with-statement)外,但没有人提及任何更多。 ;-) – RobG

相关问题