this对象是在函数运行时候基于函数的执行环境(上下文)绑定的

  1. 方法调用模式
  2. 函数调用模式
  3. 改造器调用模式
  4. apply,call,bind调用模式

1.方法调用模式

函数有所属对象,也就是这个函数是myObject.打点声明的的时候this是这个对象的本身,不可以说永远this都是myObject.

当一个函数被保存在为对象的一个属性的时,我们称它为一个方法,当一个方法被调用时,this被绑定到该对象;

    var myObject = {value :0,//记得这里是逗号不是分号increment :function(inc){console.log(this.value);//this为myObject}}myObject.increment();//0

2.函数调用模式

当函数并非一个对象的属性时,那么它被当做一个函数来调用,this被绑定到全局对象(因为这个时候foo这个函数的上下文是window绑定的,this就指向window);

    // 当执行myObject.getVlue时候var myObject = { value: 100 }//创建myObject对象myObject.getVlue = function () {console.log(this.value);//100  这里的this值为myObject对象var foo = function () {console.log(this);//window; 调用foo()他的对象winfdow,所以函数的上下文(this)为windowconsole.log(this.value);//undefined,window没有设置value的值}foo(); //函数上下文是window,所以这里的this是window,文是window}console.log(myObject.getVlue());//没有设置返回值return

这里的foo函数就相当于,方法中的函数:这个函数与方法中的this是不同的(作用链的关系),这里的foo函数可以是一些其他的函数
 注意:这里有个很麻烦的东西就是myObject.getVlue()函数中的this与foo()函数中的this不同为了为了让他们相同怎么办呢?
 来来:就是赋值呵呵myObject.getVlue()函数中的this赋值给一个变量(that)就可以了

var myObject = {value: 100}//创建myObject对象
myObject.getVlue = function(){console.log(this.value);//100这里的this值为myObject对象that = this;//关键吧myObject对象转给了that这个变量(因为foo函数的上下文为window,想在foo函数中用myobject对象就把myobject对象赋值出来)var foo = function(){console.log(this);//window; 调用foo()他的对象winfdow,所以函数的上下文(this)为windowconsole.log(that)//为myObjectconsole.log(this.value);//undefined,window没有设置value的值console.log(that.value);//100}foo();//函数上下文是window,所以这里的this是window,文是window
}
console.log(myObject.getVlue());//没有设置返回值return

3.构造器中的this:值向新的函数

js中,我们通过new关键词来调用构造函数,此时this会绑定在该对象上

    var someClass = function () {this.value = 100;}someClass();console.log(window.value);//100说明了这个时候的this还是指向全局对象var myCreate = new someClass();//构造对象;console.log(myCreate.value);//这里this值向了myCreate

集合以上3个点来搞下面的这个题

    var name = "222";var a = {name: "111",say: function () {console.log(this.name);}}var fun = a.say;fun(); // 222a.say(); // 111 var b = {name: "333",say: function (fun) {fun();}}b.say(a.say); // 222 //这里为什么是222 这里的this为什么不是呢?应为这里b.say(a.say)执行的是function(fun){}函数,难后函数里面再执行fun(),这里的fun()为全局的执行上下文b.say = a.say;b.say(); // 333

这个题目真的是难的,但也不难就是看引用他的时候函数的执行上下文是谁

1.fun = a.say :定义了一个变量fun指向了a.say中的一个函数,所以当执行fun()的时候,fun()的执行期上下文为window,而和a.say()中this的执行是不一样的

2.a.say()函数上下文为那么就是a了

3.为什么是222,这里可以理解为 形参数fun等与了实参a.say,那么fun()的执行期一样也就是window

4.b.say(),这里也要注意虽然答案很好得到,但是我们要知道是为什么?这里的赋值这是该变了一下引用地址,当我们顺的那个指针去找函数上下文的时候那么就是b了,其实也就是说虽然里面执行的函数是在对象a中的但是呢?我们通过b.say = a.say;已经把函数执行其改为了b了

例子

this其实就是执行上下文中(词法环境中的一部分),而这里obj.a中是在全局执行上下中所以this为windew

    a = 1obj = {a: 3,b: this.a,   c: function () {console.log(this); //{a: 3, b: 1, c: ƒ}return this;}}console.log(obj.b) //1console.log(obj.c()) //{a: 3, b: 1, c: ƒ}

4.apply和call调用以及bind绑定:指向绑定对象;

     var name = '小王'var age =17;var obj={name:'zqx',age:20,myFun:function(num1,num2){console.log(this.name+"年龄"+this.age+"来自"+num1+"去往"+num2)}}//obj.myFun();//console.log(obj.age);//20var db ={naem:'德玛',age:99}obj.myFun.call(db,'成都','上海');     // 德玛 年龄 99  来自 成都去往上海obj.myFun.apply(db,['成都','上海']);      // 德玛 年龄 99  来自 成都去往上海  obj.myFun.bind(db,'成都','上海')();       // 德玛 年龄 99  来自 成都去往上海obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined

三者的差别

1.bind方法返回一个新的函数,你必须调用它才可以执行.

2.call的参数和bind一样第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' ).

3.  apply 的所有传的参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])
当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

用途

bind:有的时候当你只是想定义不想执行的时候用bind(),比如React在JSX元素上定义事件的时候

call applp:在使用便需要立马调用的时候

this的详细分析加案例相关推荐

  1. puppet成长日记二 Package资源详细介绍及案例分析

    puppet成长日记二 Package资源详细介绍及案例分析 一.系统环境 1.puppet服务端 Release:RHEL6.4 HOSTNAME: puppetserver.rsyslog.org ...

  2. linux加密模块,Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果...

    原标题:Linux加解密支持模块代码详细分析之演示验证方案1实验代码及结果 3.1.5.实验代码 #include #include #include #include #include #inclu ...

  3. 现代控制理论-章节组织结构和仿真应用案例详细分析

    现代控制理论-章节组织结构和仿真应用案例详细分析 以第五章线性定常系统为例,将前四章内容,状态空间表达式.求解.能控能观和稳定性,对于线性定常系统综合设计作用等,逐一进行详细说明,并通过倒立摆仿真进行 ...

  4. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...

  5. 这个 WebKit 漏洞助力 Pwn2Own 冠军斩获5.5万美元赏金(详细分析)

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 Pwn2Own 东京大赛已落下帷幕,我不由想起了三次蝉联大赛冠军的 Fluoroacetate 团队在Pwn2Own 温哥华大赛上使用 ...

  6. 乐鑫esp8266学习rtos3.0笔记第11篇:详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  7. 文件压缩算法详细分析(ZIP)及解压实例解释

    原文地址:https://www.cnblogs.com/esingchan/p/3958962.html 最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据 ...

  8. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  9. 【渗透实战】web渗透实战,相对高安全级别下,详细分析整个渗透过程以及介绍社工的巧妙性,拿一站得数十站,(漏洞已交)

    ''' 版权tanee 转发交流请备注 漏洞已经提交管理员 关键过程的截图和脚本代码已经略去.希望大家学习技术和思路就好,切勿进行违法犯罪的活动.本实战案例仅作为技术分享,切勿在未经许可的任何公网站点 ...

最新文章

  1. 艾伦人工智能研究院开源AllenNLP,基于PyTorch轻松构建NLP模型
  2. centos 7 安装wps
  3. python映射类型-python 基础学习 — 映射类型:字典
  4. LeetCode Length of Last Word(最后一个单词的长度)
  5. postgresql 目录结构
  6. 第十三章 数据库支持
  7. 给年薪不到48w的程序员提个醒!!
  8. c++静态成员函数为什么不能为虚函数?
  9. 小米手机上安装https证书(例如pem证书,crt证书)详解
  10. 百度-北大在Kaggle发起自动驾驶环境下的汽车6-DOF预测挑战赛
  11. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
  12. 完全采用CSS的CROSS BROWSER TABBED PAGES
  13. 傲梅分区助手克隆Linux硬盘,傲梅分区助手复制磁盘或克隆磁盘到另外磁盘
  14. 02-iOS蓝牙连接流程介绍
  15. cypress——前端自动化测试框架
  16. 移动硬盘文件丢失要如何找回呢?
  17. Vue和SuperSlide做轮播效果
  18. 魅族人看魅族:我亲历的魅族发布会
  19. 海思开发板学习记录2----- 开发板配置tftp 服务
  20. 明朝历代皇帝 庙号、谥号、姓名、生卒年、在位时间、年号

热门文章

  1. getDeclaredFields方法
  2. Android的开发文档规范
  3. 中秋节活动策划PPT模板
  4. 净推荐值软件市场现状、行业发展机遇、主要驱动因素及未来发展趋势
  5. Android开机时间分析
  6. java 调用codesoft_JAVA调用CODESOFT的重要代码
  7. cydia闪退解决方案
  8. 基于模板匹配方法的机场飞机起飞-目标检测
  9. 计算机算法分析与设计复习目录(学渣必备高分圣经)
  10. 无线通信基础知识16:信号完整性