由setTimeout()里的this引出的this
example 1:
window.id='windowid';
function M(){
this.id='Mid';
this.f1=function(){console.log(this.id);};
this.f2=function(){
setTimeout(this.f1,5000);
};
}
var m=new M();
m.f2(); //'windowid'
example 2:
window.id='windowid';
function M(){
this.id='Mid';
this.f1=function(){console.log(this.id);};
this.f2=function(){
setTimeout(function(){this.f1();},5000);
};
}
var m=new M();
m.f2(); //Error: undefined is not a function
example 3:
window.id='windowid';
function M(){
this.id='Mid';
this.f1=function(){console.log(this.id);};
this.f2=function(){
var that=this;
setTimeout(that.f1,5000);
};
}
var m=new M();
m.f2(); //'windowid'
example 4:
window.id='windowid';
function M(){
this.id='Mid';
this.f1=function(){console.log(this.id);};
this.f2=function(){
var that=this;
setTimeout(function(){that.f1();},5000);
};
}
var m=new M();
m.f2(); //'Mid'
setTimeout(fun,time)中的fun是在全局对象:`window`下执行的。example3和example4的区别在于:
example3相当于在全局下执行:
(function(){console.log(this.id);})(); //this-->global object:window
example4相当于在全局下执行:
(function(){that.f1();})(); //this in side of that.f1--> m.prototype
补充:
this指谁由调用函数的方式决定,如下所示。
function foo() {
console.log(this);
}
//作为普通的函数调用
foo(); // this -->全局对象:`window`
//作为一个对象的方法属性调用
var obj = {bar: foo};
obj.bar(); // this --> `obj`
// 作为构造函数调用
new foo(); // this --> `foo.prototype`
手动指定this的方式:
1. fun.call(thisobj,param1,param2,...);
2. fun.apply(thisobj,[arguments]);
3. fun.bind(thisobj,param1,param2,...)----return a fun;
example:
this.x='windowX';
var obj={
x:'ojbX',
f1:function(a){console.log(this.x+a);}
}
var fun=obj.f1;
fun(1);
fun.call(this,1);
fun.apply(this,[1]);
fun.bind(this,1)();
fun.call(obj,1);
fun.apply(obj,[1]);
fun.bind(obj,1)(); //windowX1
//windowX1
//windowX1
//windowX1
//ojbX1
//ojbX1
//ojbX1
利用bind修改上例中的setTimeout:
window.id='windowid';
function M(){
this.id='Mid';
this.f1=function(){console.log(this.id);};
this.f2=function(){
setTimeout(this.f1.bind(this),5000);
};
}
var m=new M();
m.f2(); //'Mid'
再来看看setTimeout里function的参数问题:
var i=9;
setTimeout(function(i){console.log(i);},1000) ;
//输出结果是????
for(var i=0;i<10;i++){
setTimeout(function(){console.log(i);},1000) ;
}
//输出结果是????,输出结果的间隔是???
for(var i=0;i<10;i++){
setTimeout(function(i){console.log(i);},1000) ;
}
// ??????
for(var i=0;i<10;i++){
( function(i){ setTimeout(function(){console.log(i);},1000) }) (i);
}
由setTimeout()里的this引出的this的更多相关文章
- setTimeout里的函数是何时进入任务队列里的
先看一段代码 setTimeout(function () { console.log('abc') }, 1000) for (var i = 0; i <= 800000000; i++) ...
- setTimeout 里 传递字符串代码报错
js高程 第三版 p203 重点:超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模 式下指向window 对象,在严格模式下是undefined. 不过这里仅仅解释前半句: ...
- Lind.DDD.Utils.HttpHelper里静态对象引出的Http超时问题
回到目录 Lind.DDD.Utils.HttpHelper组件主要实现了对HTTP的各种操作,如Get,Post,Put和Delete,它属于最纯粹的操作,大叔把它封装的目的主要为了实现与API安全 ...
- setTimeout里无法调用鼠标事件的event
问题的由来是下面这段代码: middleOnmouseLeave: function (event) { setTimeout(function () { event.currentTarget.st ...
- setTimeout那些事儿
一.setTimeout那些事儿之单线程 一直以来,大家都在说Javascript是单线程,浏览器无论在什么时候,都且只有一个线程在运行JavaScript程序. 但是,不知道大家有疑问没——就是我们 ...
- setTimeout和setInterval的注意事项
精准问题 setTimeout的问题在于它并不是精准的,例如使用setTimeout设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms的cpu时间片,再次轮到定时器执行时,时间已经过 ...
- javascript线程解释(setTimeout,setInterval你不知道的事)
john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...
- 从setTimeout看js函数执行
老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数: for (var i = 0; i < 5; ...
- for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10);}
for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10);} 答案:打印4次4 这道题涉及了异步.作用域.闭包 ...
随机推荐
- 电源VCC、VSS、VDD、VEE、VPP、Vddf标号的区别
一.解释VCC:C=circuit表示电路的意思,即接入电路的电压: VDD:D=device表示器件的意思,即器件内部的工作电压:VEE:发射极电源电压,EmitterVoltage,一般用于ECL ...
- mysql INNODB_TRX 事务表
demo:/root# mysql -uroot -pkjk7787czcb --socket=/data01/mysql/mysql.sock -e"show processlist&qu ...
- Linux下查看进程(程序)启动时的环境变量
背景: 因最近试安装Linux下的jira,有一个中文插件安装后,一旦设置开机启动后,它是英文,而在终端再重新启动一次后呢,似乎插件生效,它又恢复为正常中文界面,我首先想这这涉及到一个环境变量的问题, ...
- COJ 0580 4021征兵方案
4021征兵方案 难度级别: C: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 现在需要征募女兵N人,男兵M人,每征募一个人 ...
- android 解析文章,通过JSON格式请求传递 的好文章,这里记录一下
http://blog.sina.com.cn/s/blog_8d955f8c0100xv7i.html http://blog.163.com/zhangzheming_282/blog/stati ...
- Spark计算模型-RDD介绍
在Spark集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(Resilient Distributed DataSet,RDD),它是逻辑集中的实体,在集群中的多台集群上进行数据分区.通 ...
- Linq 语法举例
1.简单的linq语法 //1 var ss = from r in db.Am_recProScheme select r; //2 var ss1 = db.Am_recProScheme; // ...
- Guava Collect
Guava是什么 进入新公司就会接触一些新的东东,Guava就是一个,Guava是Google的一个开源类库,丰富了JDK的API,并且使用起来非常方便,本文介绍的是Guava collect包下的一 ...
- diameter - degree problem
如今要构建一个网络模型,网络中的每一个节点最多和 d 个节点相连接, 且信息的传播从随意一个节点到另外随意一个节点的"最短路径" (路径依照单位路径算)都不能超过 k,问网络中最多 ...
- C#获取文件夹下指定格式的所有文件
C#获取文件夹下指定格式的所有文件的方法,虽然很简单,但还是分享一下吧,用到时可以稍加修改和优化就可以使用. 获取指定目录下所有文件 //最要使用 System.IO.Directory.GetFil ...