正如我以为我理解JS范围......
拿这段代码:
function init() {
var page;
var pageName = $('body').data('page');
switch(pageName) {
// (there are more switch cases here normally...)
case 'pSearchLatest':
require(['searchresults'], function (SearchResults) {
page = new SearchResults().init();
console.log(page); // <- shows the object!
});
default:
break;
}
console.log(page); // <- undefined
return page;
}
查看控制台日志评论。当undefined
被声明在switch语句的范围之外时,为什么第二个返回var page
?
修改
所以我错误地认为这是一个范围问题,但这取决于AMD的异步性质。
如果没有while循环检查undefined,如何在同一方法中返回require范围中的page值?
编辑2
我是这样做的:
function init(callback) {
case 'pSearchLatest':
require(['searchresults'], function (SearchResults) {
page = new SearchResults().init();
callback(page)
});
}
并在我的页面中调用包装init()方法:
new PageController().init(function(asyncViewController) {
App.view = asyncViewController;
});
答案 0 :(得分:3)
您确实正确理解了范围。该内部函数中的代码确实分配给外部作用域中的变量。
您不理解的是异步行为。 require
函数采用一个回调函数,将来会在所请求的模块可用时调用。然而,它立即返回并且控制流将导致console.log
语句,其打印undefined
- 这是page
变量当时具有的值
您应该能够识别出,因为undefined
首先记录 ,并且回调中的日志语句(带有对象)稍后执行 ,即使它在代码中出现。
答案 1 :(得分:2)
require
是异步的,因此你的函数先退出然后处理回调函数。
答案 2 :(得分:1)
两个可能的原因......你没有匹配案例。或者还没有执行将值赋值给page
的回调。我猜它是后者,因为如果你case
失败将是显而易见的。查看您正在使用的任何AMD库的文档,并查看如何执行传递给require
的函数。
同样作为一般规则尝试避免返回由此类异步调用确定的值。而是使用某种Observer模式来订阅可以从不同位置触发的特定事件。