是匿名函数动态范围?

时间:2017-08-18 20:41:47

标签: javascript anonymous-function

我在Java中也读到匿名函数在封闭函数中引入了一个新的作用域,而lambda表达式是块本地的。这意味着上面的内容。我对以下示例感到困惑:

var timer = {
    seconds: 0,
    start() {
        setInterval(() => {
            this.seconds++
        }, 1000)
    }
}
// When an item is searched, it starts from the anonymous function
// and this doesn't mean the same as parent this.
// This means that we can access this .seconds by first going to
// its enclosing function in the arrow expression.
timer.start()

setTimeout(function () {
    console.log(timer.seconds)
}, 3500)

这里this.seconds将在封闭函数中引入一个新的范围,如果它是一个匿名函数。我对吗? Static (Lexical) Scoping vs Dynamic Scoping (Pseudocode)

1 个答案:

答案 0 :(得分:0)

这里的区别是this。箭头函数不会更改this的值,而使用function关键字创建的函数则会更改。{/ p>

这就是为什么上面的代码与以下代码之间存在差异:

var timer = {
    seconds: 0,
    start() {
        setInterval(function(){
            this.seconds++
        }, 1000)
    }
}
// When an item is searched, it starts from the anonymous function
// and this doesn't mean the same as parent this.
// This means that we can access this .seconds by first going to
// its enclosing function in the arrow expression.
timer.start()

setTimeout(function () {
    console.log(timer.seconds)
}, 3500)

在此代码中,function(){会将this的值覆盖为自身,因此不再有秒变量。

传统的匿名函数和箭头函数之间的范围(函数可以访问哪些变量)没有区别,只有传统的匿名函数创建新的this而箭头函数没有。