setTimeout的作用域以及this的指向问题

来源:互联网 发布:乐驰网络俱乐部 编辑:程序博客网 时间:2024/05/14 12:37

setTimeout方法是挂在window对象下的。《JavaScript高级程序设计》第二版中,写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined”。在这里,我们只讨论非严格模式。

setTimeout接受两个参数,第一个是要执行的代码或函数,第二个是延迟的时间。

一、先说结论:setTimeout中所执行函数中的this,永远指向window!!注意是要延迟执行的函数中的this哦!!

1. 直接使用,代码1.1:

setTimeout("alert(this)", 1);   // [object Window]
2. 在一个对象中调用setTimeout试试,代码1.2:
var obj = {  say: function() {    setTimeout("alert('in obj ' + this)", 0)  }}obj.say();   // in obj [object Window]
3. 将执行的代码换成匿名函数试试,代码1.3:

var obj = {  say: function() {    setTimeout(function(){alert(this)}, 0)  }}obj.say();   //  [object Window]


4. 换成函数引用再试试吧,代码1.4:

function talk() {  alert(this);}var obj = {  say: function() {    setTimeout(talk, 0)  }}obj.say();   //  [object Window]

恩,貌似得到的结论是正确的,setTimeout中的延迟执行函数中的this指向了window。这里我反复的强调,是延迟执行函数中的this,是因为,我们经常会面对两个this。一个是setTimeout调用环境中的this,一个就是延迟执行函数中的this

0 0
原创粉丝点击