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
,但我想知道为什么没有示例。感谢额外的参数提醒:)我已经忘记了它们,但是浏览器对这些上下文参数的支持真的那么好吗?