将javascript / Type脚本的2个功能合二为一

时间:2017-09-19 14:57:34

标签: javascript angular typescript

我有一个Date变量,我每秒都会更新它以使其生效。

现在这是我的变量。

var stationdate = new Date(data.localTime);

我的 Javascript 代码每秒更新一次。

window.setInterval(function () {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));            
  }, 1000);

我的输入脚本代码将其返回到Angular UI。

window.setInterval(() => this.time = stationdate, 1000);

我的问题。

如果两个函数都是分离的,那么它可以完美地运行。

但如果我将它们合并就会停止工作。

见下文。

window.setInterval(function () {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
    this.time = stationdate;            
  }, 1000);

上午我错过了类型脚本的胖嘟嘟声?

什么应该是正确的功能?

5 个答案:

答案 0 :(得分:5)

每个function都拥有自己的this上下文。所以你的this引用了函数表达式中的另一个对象。对于arrow function,它引用包含this

的外部arrow function

使用箭头语法,无需在window后面使用setInterval前缀。

setInterval(() => {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
    this.time = stationdate;            
  }, 1000);

更多阅读 Arrow function vs function declaration/expression - 这是Javascript中的主要概念之一。

答案 1 :(得分:1)

在两种功能的组合中,您不使用箭头功能,这导致this的上下文为window。使用箭头函数保留this的外部上下文。

window.setInterval(() => {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
    this.time = stationdate;            
}, 1000);

答案 2 :(得分:1)

window.setInterval( () => {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
    this.time = stationdate;            
  }, 1000);

在您的代码中,这有错误的上下文。 胖箭头功能是ES6的功能,与TypeScript

无关

答案 3 :(得分:1)

在第二个示例中,this引用函数的内部范围,而不是最可能定义变量的外部范围。因此,正如其他人所建议的那样,您需要使用lambda符号。

此外,由于您使用的是AngularJS,因此最好使用$interval代替window.setInterval()

请注意,通过使用$interval,如果您的变量已更改,则会$scope.$apply()进行脏检查,然后更新UI。使用window.setInterval()时,这不是给定的。或者,您仍然可以告诉$interval不要使用$apply,如果这是您需要的话。

答案 4 :(得分:1)

使用回调的常见错误。所有在javascript中都有自己的'这个'上下文(箭头函数除外)。只为系统功能这个=== undefined。

正确的方法是使用箭头功能(如上所示)。最适合现代浏览器(或转换代码)。

 window.setInterval(() => {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
    this.time = stationdate;            
  }, 1000);

另一种存储方式'是绑定上下文:

window.setInterval((function () {        
    stationdate = new Date(stationdate.setSeconds(stationdate.getSeconds() + 1));
    this.time = stationdate;            
  }).bind(this), 1000);

或更多解释:

window.setInterval(
    (function(){console.log(this.hello);}).bind({hello:'hello!'})
   , 1000);