【问题标题】:Typescript lambdas and closure (scope)Typescript lambdas 和闭包(范围)
【发布时间】:2016-05-18 03:55:18
【问题描述】:

我为多个用户加载了一些数据,我想将其存储到一个 javascript 数组中。 在纯打字稿中,我会这样写:

for(var i = 0; i < 5; i++) {
   promise[i] = httpquery.then( 
     (data) => { this.usersData[i] = data }
   );
)

...

this.$q.all[promise].then(......

不幸的是,我的打字稿 lambda 只保护这个(而不是变量 i)。所以在我的情况下,它将始终将数据存储在 this.usersData[5] 中。

对,我需要一个闭包,而 lambda 表达式的作用有点类似于闭包,就我理解这个打字稿的语言部分而言。

所以让我们尝试用 Typescript 做点什么:

for(var i = 0; i < 5; i++) {
   promise[i] = (index = i) => {
       return httpquery.then( 
          (data) => { this.usersData[index] = data }
       );
   }();
)

根本不起作用(甚至无法编译)。为什么 ?因为似乎 () => {} 并不是真正的函数。我通过这种方式解决了这个问题:

for(var i = 0; i < 5; i++) {
   var getData = (index = i) => {
       return httpquery.then( 
          (data) => { this.usersData[index] = data }
       );
   };
   promise[i] = getData();
)

我发现它不是超级漂亮:-p。 所以我的问题是:在这种情况下如何处理问题?像我一样?或者有一种方法可以以更漂亮的方式在 typescript 中使用 lambda? 为什么

 () => {}() 

不工作,但是

 var test = () => {}; 
 test(); 

有效吗?是因为打字稿编译器不够“聪明”,无法理解 lambda 是一个函数吗?

谢谢。

【问题讨论】:

    标签: lambda typescript closures


    【解决方案1】:

    原因:

    promise[i] = (index = i) => {
      return httpquery.then( 
        (data) => { this.usersData[index] = data }
      );
    }();
    

    doesn't parse 是因为它不是有效的 JavaScript(var x = a =&gt; { return a + 1; }(3) 是 JavaScript 和 TypeScript 中的 SyntaxError。只需将 lambda 包装在括号中就足以使其成为有效的表达式。

    但是,仅仅这样做并不能解决您的捕获问题 - 每次调用都会评估默认参数,因此它们都将指向 var 的最终绑定值。

    您可以:

    A) 切换到在初始化程序中使用 let(在这种情况下,TypeScript 会自动做正确的事情:

    for(let i = 0; i < 5; i++) {
      promise[i] = httpquery.then(data => this.usersData[i] = data);
    }
    

    B) 自己手动创建闭包:

    for(var i = 0; i < 5; i++) {
      promise[i] = (index => httpquery.then(data => this.usersData[index] = data))(i);
    }
    

    【讨论】:

    • 确实,使用 let 是最漂亮的解决方案。我仍然使用 var 并没有花时间看 let/const,我认为是改变这个坏习惯的正确时机。谢谢!
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多