Javascript case`this`在匿名函数中的预期用途?

Javascript case`this`在匿名函数中的预期用途?,javascript,ecmascript-2016,Javascript,Ecmascript 2016,问题 我今天刚开始学习JS/ES7,想看看我是否理解了这一点 基于下面的两个代码片段,我想这个的目的是可以选择是否要从父函数继承变量 如果这是正确的,那么在第一个示例中的setInterval()中使用this是否有合法的用例 var countup = { counter: 0, start:function(){ var countup = this; setInterval(function(){ countup.c

问题

我今天刚开始学习JS/ES7,想看看我是否理解了这一点

基于下面的两个代码片段,我想
这个
的目的是可以选择是否要从父函数继承变量

如果这是正确的,那么在第一个示例中的
setInterval()
中使用
this
是否有合法的用例

var countup = {
    counter: 0,

    start:function(){
        var countup = this;
        setInterval(function(){
            countup.counter++;
        }, 1000);
    }
};

countup.start();

更新

问我上述问题的另一种方式是:

有谁能在
setInterval()
中提出一个好的
这个
的用例吗


在第一个例子中,当定义
startup
函数时,您正在分配
this
值,并将其分配给变量
countup
,此时
this
存储在
countup
变量中,该变量将由
setInterval
功能

如果不这样做,则在
函数中
此取自该函数执行的上下文。这意味着当
setInterval
将运行
时,这将是全局对象,因为传递给
setInterval
的回调将在全局上下文中执行:

var countup={
柜台:0,,
开始:函数(){
setInterval(函数(){
//这不是词法,而是执行的上下文
//由于未定义this.counter,因此将打印NaN(未定义+1==NaN)
这个.counter++;
log(“this==window::true”,this==window,“this.counter::NaN::”,this.counter);
}, 1000);
}
};

countup.start()
setInterval
存在于全局/上,因此
this
的值与该值绑定。由于全局函数是唯一的,在整个脚本中都是可访问的,因此我认为使用
setInterval

的“绑定”函数不会有任何用例,我认为“继承”这个词不合适

每次调用函数时,都会出现(“此值”,有时称为“接收器”)。此值的大小取决于调用函数的方式

添加到语言中,以启用类似Java的面向对象语法。例如:

类点{
构造函数(x,y){
这个。x=x
这个。y=y
}
getX(){
把这个还给我
}
}
…或使用构造函数:

功能点(x,y){
这个
这个
}
Point.prototype.getX=函数(){
把这个还给我
}
因此,
使程序员能够方便地引用调用函数的对象作为方法:

const a = new Point(1, 2);
console.log(a.getX());
…但是,不幸的是,JavaScript中的
这个
有额外的复杂性

复杂性源于能够以对象上的方法以外的方式调用函数(有关详细信息,请参阅)。例如:

函数myFunction(){
console.log(this)/`undefined`在严格模式下,window`在非严格模式下
}
myFunction()/`myFunction`未作为方法调用!
您的第一个示例提供了一个以方法以外的方式调用函数的示例:在作为对
setInterval
的回调提供的函数中,this值应该是什么?碰巧,提供给
setInterval
的函数中
this
的默认值是全局对象(在本例中是
window

…这解释了我们在代码中看到的习惯用法:将
this
的值赋给
的变量
(在您的示例中,我将其从“countup”重命名),以便回调结束。通过这种方式,无论何时调用,我们都可以从回调中引用外部词汇环境的this值

var countup={
柜台:0,,
开始:函数(){
var=this
setInterval(函数(){
那个柜台++
}, 1000)
}
}
您的第二个示例也在做同样的事情,但使用的是更现代的JavaScript。箭头函数始终使用声明它们的词法环境的this值(“词法this”)。因此,我们可以去掉中间变量
,即
变量:

var countup={
柜台:0,,
开始:函数(){
setInterval(()=>this.counter++,1000)
}
}
setInterval
内部,默认的
值是全局对象,但是没有任何东西可以阻止您使用箭头函数或使用另一个此值。它只是对对象的引用(或
null
,或
未定义的
)。因此,如果您希望从
setInterval
更新共享状态,则可以通过
进行更新。这是不是一个好主意是主观的。就我个人而言,我尽量避免使用
这个
,因为我认为这会使事情变得更复杂,但很多开发人员的想法正好相反

根据我的经验,
这个
倾向于在使用基于类的面向对象的代码库中使用得更多,因为这些代码库中的方法经常需要引用调用它们的对象上的状态

类时钟{
开始(){
setInterval(()=>this.tick(Date()),1000)//使用词法“this”!
}
勾选(时间){
console.log(时间)
}
}
常数c=新时钟

c、 start()
,因为第一个示例允许两个不同的
this
。你能想出一个在
setInterval()中使用
this
的用例吗?我已经更新了OP.@SandraSchlichting,在第一个示例中,您已经给出了使用
的良好用例。这里有一个更新同一对象属性的函数。为此,您需要
参考
var countup = {
    counter: 0,

    start:function(){
        var countup = this;
        setInterval(function(){
            // insert good use case of `this` inside this function?
            countup.counter++;
        }, 1000);
    }
};

countup.start();
const a = new Point(1, 2);
console.log(a.getX());