Javascript “什么是”呢;这";何时在setTimeout的回调中? 对于新的问题道歉,但是考虑这个代码 function Greeter( name) { this.name = name; } Greeter.prototype.delayed_greet = function() { setTimeout( function cb() { console.log(' Hello ' + this.name); }, 500); }; Greeter.prototype.greet = function() { console.log(' Hello ' + this.name); } const greeter = new Greeter(' World'); greeter.delayed_greet(); // will print "Hello undefined" greeter.greet(); // will print "Hello World"
因此,在Javascript “什么是”呢;这";何时在setTimeout的回调中? 对于新的问题道歉,但是考虑这个代码 function Greeter( name) { this.name = name; } Greeter.prototype.delayed_greet = function() { setTimeout( function cb() { console.log(' Hello ' + this.name); }, 500); }; Greeter.prototype.greet = function() { console.log(' Hello ' + this.name); } const greeter = new Greeter(' World'); greeter.delayed_greet(); // will print "Hello undefined" greeter.greet(); // will print "Hello World",javascript,this,Javascript,This,因此,在delayed_greet方法中,当它嵌套在setTimeout中时,它指的是什么?它显然不是指greeter对象,否则它会工作。setTimeout通常在浏览器中定义为window.setTimeout,可以称为setTimeout,因为它在全局范围内可用 这也意味着上下文和此值始终是窗口,除非明确设置了另一个此值 说 setTimeout()执行的代码是从执行上下文调用的 与调用setTimeout的函数分离 为被调用函数设置this关键字的常用规则 应用,如果您没有在调用中或使用b
delayed_greet
方法中,当它嵌套在setTimeout
中时,它指的是什么?它显然不是指greeter
对象,否则它会工作。setTimeout
通常在浏览器中定义为window.setTimeout
,可以称为setTimeout
,因为它在全局范围内可用
这也意味着上下文和此
值始终是窗口
,除非明确设置了另一个此
值
说
setTimeout()
执行的代码是从执行上下文调用的
与调用setTimeout的函数分离
为被调用函数设置this
关键字的常用规则
应用,如果您没有在调用中或使用bind设置此,则
将默认为非严格模式下的全局(或窗口)对象,或
在严格模式下不可定义
它将不同于该函数的此
值
称为setTimeout
MDN还概述了解决setTimeout
中“此问题”的多种方法。
就我个人而言,我认为我应该采取简单的方法,使用一个变量
Greeter.prototype.delayed_greet = function() {
var that = this;
setTimeout( function cb() {
console.log(' Hello ' + that.name);
}, 500);
};
另一个选项是箭头函数,因为它们保留周围的上下文,而不创建自己的上下文
var o={
fn(){
setTimeout(()=>{console.log(this)},500)
}
}
var o2={
fn(){
setTimeout(函数(){
console.log(此===窗口)
}, 1000)
}
}
o、 fn();//fn()---箭头函数
o2.fn();//的确,is window--常规函数
setTimeout
在浏览器中通常定义为window.setTimeout
,可以称为setTimeout
,因为它在全局范围内可用
这也意味着上下文和此
值始终是窗口
,除非明确设置了另一个此
值
说
setTimeout()
执行的代码是从执行上下文调用的
与调用setTimeout的函数分离
为被调用函数设置this
关键字的常用规则
应用,如果您没有在调用中或使用bind设置此,则
将默认为非严格模式下的全局(或窗口)对象,或
在严格模式下不可定义
它将不同于该函数的此
值
称为setTimeout
MDN还概述了解决setTimeout
中“此问题”的多种方法。
就我个人而言,我认为我应该采取简单的方法,使用一个变量
Greeter.prototype.delayed_greet = function() {
var that = this;
setTimeout( function cb() {
console.log(' Hello ' + that.name);
}, 500);
};
另一个选项是箭头函数,因为它们保留周围的上下文,而不创建自己的上下文
var o={
fn(){
setTimeout(()=>{console.log(this)},500)
}
}
var o2={
fn(){
setTimeout(函数(){
console.log(此===窗口)
}, 1000)
}
}
o、 fn();//fn()---箭头函数
o2.fn();//确实,window--常规函数取决于上下文,但在浏览器中,它很可能是窗口
谢谢@adeneo的评论,你能详细说明一下为什么setTimeout
将其作为窗口
或全局
对象吗?DelayedGreeter
构造函数在哪里?该代码将给出一个错误。这是我的一个输入错误@Andy,我现在已经修复了它。在构造函数中也要记住:this.name=name
这取决于上下文,但在浏览器中,它很可能是窗口
感谢@adeneo的评论,您能详细说明为什么设置超时
将此作为窗口
或全局
对象吗?DelayedGreeter
构造函数在哪里?该代码将给出一个错误。这是我的一个输入错误@Andy,我现在已经修复了它。在构造函数中也要记住:this.name=name代码>如果ES6,-则少一个变量。(编辑:我看到MDN文档中已经介绍了这一点)。是的,箭头函数是“特殊的”,它们保留了周围的上下文,即使在计时器->是否有特定的原因您没有添加bind
example?@Taurus-不,不是真的,但这也是一个选项。所有现代浏览器都支持将附加参数传递到setTimeout
,因此人们可以执行setTimeout((即)=>{},1000,this)
,以及传递一些值等操作。@adeneo我刚才问了这个问题,因为bind
在它可以应用到的问题中确实被省略了很多(您确实提到了bind
,但我想知道为什么没有一个示例。感谢额外的参数提醒:)已经忘记了它们,但是浏览器对这些上下文参数的支持真的那么好吗?如果ES6,-少一个变量。(编辑:我知道MDN文档中已经介绍了)。是的,箭头函数是“特殊的”,它们保留了周围的上下文,即使在timers->是否有特定的原因您没有添加bind
示例?@Taurus-不,不是真的,但这也是一个选项。所有现代浏览器还支持将附加参数传递到setTimeout
,因此可以执行setTimeout((即)=>{},1000,这个)
以及传递一些值等。@adeneo我之所以这样问,是因为bind
确实在它可以积极应用的问题中被省略了很多(您确实提到了bind
,但我想知道为什么没有示例。感谢额外的参数提醒:)我已经忘记了它们,但是浏览器对这些上下文参数的支持真的那么好吗?