Javascript case`this`在匿名函数中的预期用途?
问题 我今天刚开始学习JS/ES7,想看看我是否理解了这一点 基于下面的两个代码片段,我想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
这个
的目的是可以选择是否要从父函数继承变量
如果这是正确的,那么在第一个示例中的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());