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;我不清楚如何(或是否)可以使用bind
或apply
来使这些外部定义的方法可以访问itemA
,或者是否有class XYZ(ModelView):
column_list = ['id', 'selection']
column_filters = ['selection']
我不熟悉的一些其他机制可以使这成为可能。
答案 0 :(得分:3)
没有。 Javascript中的范围是词法(基于代码的位置)。您无法更改已声明的函数的范围。
然而,当您调用它时,您可以简单地将itemA
作为参数传递给outerFunction
。这是解决这类问题的通常和预期的方法。
还有其他一些技术可以让事情更自动地访问一组变量,例如将值分配给更高但共享的范围,或者在公共对象上创建方法,这些方法都可以共享对实例数据的访问,但它不是从您对问题的描述中可以明显看出,在这种情况下,这些问题是否合适。
但我不清楚如何(或者是否)可以使用bind或apply 给这些外部定义的方法访问itemA或者如果有的话 我不熟悉的其他一些机制可以做到这一点 可能的。
.bind()
和.apply()
不会以任何方式影响范围。它们使您可以控制this
和/或函数参数的值。如果感兴趣的变量在某个对象上可用,那么您可以使用.bind()
,.apply()
或.call()
为该对象设置this
的值,并允许您的函数使用通过this.property
访问数据。