【发布时间】:2011-06-30 00:15:24
【问题描述】:
我正在尝试将函数范围传递给回调方法。我遇到的问题是我得到了对象范围,它不能让我访问原始函数中的参数和局部变量。我对“this”的理解是指当前上下文(无论是窗口还是某个对象)除了本地声明的变量和参数。 [在“执行上下文”部分引用 Richard Cornford 在http://jibbering.com/faq/notes/closures/ 的出色工作]。我也了解 JavaScript 中的变量具有函数范围(如果它们在函数内声明,则只能从该函数内访问)。
有了这种理解,在一个新的环境中,我正在尝试编写一个模式,我为我以前的雇主做了很多工作,调用一个异步方法,指定一个回调处理程序并传递我当前的范围,期望它可以在回调方法。在我当前的环境中,我发现情况并非如此。 (披露:我在以前的环境中使用 ExtJS...现在让我觉得我对框架有点太舒服了,对正在发生的事情做出假设)。
我的简单测试代码演示了我正在尝试做什么以及什么不起作用。
function myHandler(data, ctx) {
console.log('myHandler(): bar: ' + bar); // <- prob: bar undefined
console.log(JSON.stringify(data));
}
MySvcWrap = {
doWork: function(p1, callback, scope) {
var result = {colors: ['red', 'green'], name:'Jones', what: p1};
if (callback) {
callback.call(scope||this,result, scope);
}
}
}
function lookup() {
var bar = 'food'; // local var
MySvcWrap.doWork('thang', myHandler, this); // scope object is this
}
lookup();
这里的问题是传递给 MySvcWrap.doWork 的“this”在这种情况下是 Window 全局对象。我的意图是将函数的执行上下文传递给 myHandler。
我尝试过的。如果我传递一个对象而不是“this”,那么它可以工作,例如:
function myHandler(data, ctx) {
console.log('myHandler(): this.bar: ' + this.bar); // <- no prob: this.bar
console.log(JSON.stringify(data));
}
function lookup() {
var bar = 'food'; // local var
MySvcWrap.doWork('thang', myHandler, {bar: bar}); // scope object is just object
}
我需要有人把我放在头上......在我的第一种情况下传递“this”时,当然这是全局范围(我在一个全局定义的函数中)......我的问题是我认为在传递范围时我可以在该上下文中访问本地定义的变量和参数...我是否在动摇我以前对 JS 的理解?如何完成这项任务?
【问题讨论】:
标签: javascript scope closures