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的更多相关文章

  1. setTimeout里的函数是何时进入任务队列里的

    先看一段代码 setTimeout(function () { console.log('abc') }, 1000) for (var i = 0; i <= 800000000; i++) ...

  2. setTimeout 里 传递字符串代码报错

    js高程 第三版 p203 重点:超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模 式下指向window 对象,在严格模式下是undefined. 不过这里仅仅解释前半句: ...

  3. Lind.DDD.Utils.HttpHelper里静态对象引出的Http超时问题

    回到目录 Lind.DDD.Utils.HttpHelper组件主要实现了对HTTP的各种操作,如Get,Post,Put和Delete,它属于最纯粹的操作,大叔把它封装的目的主要为了实现与API安全 ...

  4. setTimeout里无法调用鼠标事件的event

    问题的由来是下面这段代码: middleOnmouseLeave: function (event) { setTimeout(function () { event.currentTarget.st ...

  5. setTimeout那些事儿

    一.setTimeout那些事儿之单线程 一直以来,大家都在说Javascript是单线程,浏览器无论在什么时候,都且只有一个线程在运行JavaScript程序. 但是,不知道大家有疑问没——就是我们 ...

  6. setTimeout和setInterval的注意事项

    精准问题 setTimeout的问题在于它并不是精准的,例如使用setTimeout设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms的cpu时间片,再次轮到定时器执行时,时间已经过 ...

  7. javascript线程解释(setTimeout,setInterval你不知道的事)

    john resig写的一篇文章: 原文地址:http://ejohn.org/blog/how-javascript-timers-work/ 作为入门者来说,了解JavaScript中timer的 ...

  8. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

  9. 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 这道题涉及了异步.作用域.闭包 ...

随机推荐

  1. Windows系统编程之进程间通信

    Windows系统编程之进程间通信作者:北极星2003来源:看雪论坛(www.pediy.com)Windows 的IPC(进程间通信)机制主要是异步管道和命名管道.(至于其他的IPC方式,例如内存映 ...

  2. 启动Activity但不显示其界面

    最近在工作中做了一个很简单的任务,制作一个apk,点击该app链接到某一个网站.     代码很简单,只有如寥寥几行: (browser.java) package com.test.browser; ...

  3. 【转】在linux内核中读写文件 -- 不错

    原文网址:http://blog.csdn.net/tommy_wxie/article/details/8194276 1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成 ...

  4. link@import

    1.两者区别 1)link属于XHTML标签,而@import是CSS提供的;2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载; 3)import只在IE ...

  5. Win8 系统下串口出现叹号 异常(10)

    在网上找了些资料,自己试了一下可行,具体步骤就是把win8系统自动更新驱动的功能给关掉,然后自己下载可用的驱动.具体可以看 http://download.csdn.net/detail/wuu_ex ...

  6. F - Truck History - poj 1789

    有一个汽车公司有很多年的汽车制造历史,所以他们会有很多的车型,现在有一些历史学者来研究他们的历史,发现他们的汽车编号很有意思都是有7个小写字母组成的,而且这些小写字母具有一些特别的意义,比如说一个汽车 ...

  7. in, out, ref

    C#中的函数传递方式可以为in.out.ref(引用) in方式的是默认的传递方式,即向函数内部传送值,不作讲解 很多语言都有类似的操作从函数向调用者返回值,这样我们可以通过函数的调用返回多个值,因为 ...

  8. jQuery on()绑定动态元素出现的问题小结

    jQuery on()方法是官方推荐的绑定事件的一个方法.使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件,通过本文给大家介绍jQuery on()绑定动态元素出现的问题小结,需要的朋友 ...

  9. IBinder对象在进程间传递的形式(一)

    命题 当service经常被远程调用时,我们经常常使用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind servic ...

  10. 【转】Android:Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...