JavaScript 有一套完全不同于其它语言的对 this 的处理机制。

种不同的情况下 ,this 指向的各不相同。

1。全局范围内

当在全部范围内使用 this,它将会指向全局对象。

2。函数调用

这里 this 也会指向全局对象,可以这么理解

在这里,我们可以这么理解没有明确的调用对象的时候,函数的this还是在全局范围内,所以这里的this绑定到全局的window对象

3。对象方法的调用

故名思义,这里的this是在对象中的

我们在控制台中打印

这里的this指向的是对象obj

当然了下面这种情况, this指向的也是obj

所以,可以这么理解,函数在对象内部或者在对象外部定义,实现的效果一样

就是说this指向的对象同样都是obj

作为对象属性的函数,对于对象来说是独立的


当然了,对象中this也会存在绑定丢失的问题

这里可以看到this指向的并不是obj对象,而是外部的全局环境

所以,我们可以看到在某些情况下(赋值操作),this的隐式绑定所存在的this绑定丢失的问题。

就是执行“ func= obj.b”之后func的调用和obj.b调用的结果是不同的因为这个函数赋值的过程无法把b所绑定的this也传递过

所以在这种情况下,this绑定丢失之后导致的问题是,这个时候this无法指向obj对象,而指向了全局环境,所以a的结果就为2

那么怎么解决呢?
这个时候需要用到this的显示绑定
 
显示绑定就是使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this将会被 显示设置为函数调用的第一个参数。
 
我们看代码
   

在使用了call或者apply方法之后,原本因为赋值操作导致func函数内丢失的指向obj对象的this,现在确实又指向了obj对象

通过this的显示绑定,就解决了this绑定丢失的问题

当然了如果觉得每次调用多敲几个字母,会麻烦,可以封装一下这个调用方法

当然了,还可以追求简单,可以不用封装,写的更简单一点

我们可以使用bind()方法来绑定,就不需要再写一个函数用来封装一句代码了

这里我们也可以看出使用bind和call(apply),这两种方式来绑定this,还是有所区别的

bind:是提供了一个可执行的函数,但是本身并会自执行,还需要我们手动执行

call(apply):提供了一个立即执行的函数,绑定的同时也执行了该函数

好,我们继续往下看

在对象中调用的时候,如果出现 对象里面还有对象,多层嵌套之后,this是指向哪个对象呢?

我们可以看到,在不同的对象中执行函数,this指向的作用域也不一样,所以这点要切记

4。调用构造函数

执行new操作的时候,将创建一个新的对象,并且将构造函数的this指向所创建的新对象

 
 

JavaScript之this的工作原理的更多相关文章

  1. JavaScript中this的工作原理以及注意事项

    在JavaScript中,this 的概念比较复杂.除了在面向对象编程中,this 还是随处可用的.这篇文章介绍了this 的工作原理,它会造成什么样的问题以及this 的相关例子. 要根据this  ...

  2. JavaScript的计时器的工作原理

    最近都在看一些JavaScript原理层面的文章,恰巧看到了jQuery的作者的一篇关于JavaScript计时器原理的解析,于是诚惶诚恐地决定把原文翻译成中文,一来是为了和大家分享,二来是为了加深自 ...

  3. 详解javascript中this的工作原理

    在 JavaScript 中 this 常常指向方法调用的对象,但有些时候并不是这样的,本文将详细解读在不同的情况下 this 的指向. 一.指向 window: 在全局中使用 this,它将会指向全 ...

  4. javaScript中闭包的工作原理

    一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话 ...

  5. JavaScript prototype背后的工作原理

    首先从一个函数说起 function fn1(name, age) { this.name = name; this.age = age; this.say = function() { alert( ...

  6. JavaScript原型继承工作原理

    原型继承的定义 当你阅读关于JS原型继承的解释时,你时常会看到以下这段文字: 当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止.——出自JavaScript秘 ...

  7. How Javascript works (Javascript工作原理) (十四) 解析,语法抽象树及最小化解析时间的 5 条小技巧

    个人总结:读完这篇文章需要15分钟,文章介绍了抽象语法树与js引擎解析这些语法树的过程,提到了懒解析——即转换为AST的过程中不直接进入函数体解析,当这个函数体需要执行的时候才进行相应转换.(因为有的 ...

  8. 《浏览器工作原理与实践》<08>调用栈:为什么JavaScript代码会出现栈溢出?

    在上篇文章中,我们讲到了,当一段代码被执行时,JavaScript 引擎先会对其进行编译,并创建执行上下文.但是并没有明确说明到底什么样的代码才算符合规范. 那么接下来我们就来明确下,哪些情况下代码才 ...

  9. javascript引擎工作原理

    1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序.比方说,当你写了 var a = 1 + ...

随机推荐

  1. 使用python将ppm格式转换成jpg【转】

    转自:http://blog.csdn.net/hitbeauty/article/details/48465017 最近有个很火的文章,叫 有没有一段代码,让你觉得人类的智慧也可以璀璨无比? 自己试 ...

  2. 【转载】SQL Server 2008 R2 使用的端口解析

    转载博客:http://www.cnblogs.com/studyzy/archive/2009/11/30/1614139.html SQL Server在安装到服务器上后,出于服务器安全的需要,所 ...

  3. 在本地(自己电脑上)部署了tomcat服务器,真机测试遇到的问题

    开始的时候自己就是给app搭建了一个小的框架,只有一个界面发送了网络请求,部署的tomcat,数据成功请求,得到了数据. 后来随着联网请求的增多,突然发现联网请求一直失败.自己dubug了最开始的第一 ...

  4. fetch API 简单解读

    http://f2e.souche.com/blog/fetch-api-jie-du/?utm_source=tuicool&utm_medium=referral 在我们日常的前端开发中, ...

  5. python 设计模式之门面模式

    facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库.   门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...

  6. 快速销售订单 - OM:销售订单表单:级联行题头更改

    PROFILE OM:销售订单表单:级联行题头更改

  7. 【spring boot】12.spring boot对多种不同类型数据库,多数据源配置使用

    2天时间,终于把spring boot下配置连接多种不同类型数据库,配置多数据源实现! ======================================================== ...

  8. HDU4004

    题目大意,有一条长度为L和河流,中间穿插n个石凳,青蛙跳m次经过石凳后到达对岸,求青蛙每次跳跃的最大距离的最小值 本题数据量大n<500000,显然简单的o(n*n)算法是通过不了的,在输入大量 ...

  9. python核心编程学习(第三版)之网络编程

    套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...

  10. 2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(二)部署流程资源 内容概览:讲解流程资源的读取与部署. 5.2 部署流程资源 5.2.1 流程资源 流程资源常用的有以下几种 ...