0

就像我以为我理解 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;

}

请参阅控制台日志注释。当在 switch 语句的范围之外声明undefined时,为什么第二个返回?var page

编辑

所以我错误地认为这是一个范围问题,但这取决于 AMD 的异步特性。

如何在没有 while 循环检查未定义的情况下以相同的方法返回 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;
});
4

3 回答 3

3

您确实正确理解了范围。该内部函数中的代码确实分配给外部范围内的变量。

您不了解的是异步行为。该require函数采用一个回调函数,该函数将在将来的某个时间调用 - 当请求的模块可用时。然而,它确实会立即返回,并且控制流将导致console.log执行打印的语句undefined- 这是当时变量page的值。

您应该能够认识到,因为首先undefined记录了 ,并且回调中的 log 语句(带有对象)稍后执行,即使它在代码中出现。

于 2013-06-05T18:42:24.780 回答
2

require是异步的,因此您的函数确实先退出然后处理回调函数。

于 2013-06-05T18:43:16.950 回答
1

两个可能的原因......你不匹配的情况。page或尚未执行值分配的回调。case我猜是后者,因为如果你失败了,这很明显。查看您使用的任何 AMD 库的文档,并查看传递给的函数的require执行方式。

同样作为一般规则,尽量避免返回由这样的异步调用确定的值。而是使用某种观察者模式来订阅可以从不同位置触发的特定事件。

于 2013-06-05T18:39:50.033 回答