/*
这个主题 主要是为了论述 js 中一个最烦人的问题 --> this 的指向问题 其实,这个 this 到底指向什么,指向谁,查了好多资料、书籍、官文,也没有给出明确的一个结论, 也学这也就是 this指向 的难点所在,没有定论 可以作为判断依据; 但是呢,这个又是非常重要的一个问题,大家也都一直在寻找和探索一个可以作为 定律的判断依据,在我深研了好几天之后,我做出以下的结论: 先给出结论: 1.this 的指向 是在执行上下文时才确定的, 并且确定后不可更改; 2.this 指向 “其执行上下文的环境对象”; 在做了 N个测试之后,这一结论基本可以作为所有 this 指向问题的判断依据;
*/
/*
下面我们来 验证结论的 第1条: 分析结论:第1条,也就是只有 上下文被正式放入调用栈(call stack)中执行时,才能确定 this的指向;并且,一旦确定 不可更改;
*/
// demo 1:
var obj = {a:10}
function test(){
console.log(this);
} test(); // Window
test.apply(obj); // obj
/*
demo1中 两种不同的test() 函数运行方式,this 有了两个不同指向,充分证实了 this 的指向不是代码一编译好就确定的, 而是 必须在执行的时候,视 环境对象(这个环境对象 在论述 结论2时,详说)而定的;
*/ // demo 2:
var obj = {a:10}
function test(){
this = obj
console.log(this);
} test(); // Uncaught ReferenceError: Invalid left-hand side in assignment
/*
demo2 在test()执行上下文时,试图修改 this 指向,结果报错,这是因为,在test()执行上下文的 创建阶段 就已经确定了this的指向, 在随后的 执行阶段,试图更改 this 的指向,结果报错; 这一结果,也证明了 this 一旦确定指向是不可更改的;
*/ /*
下面我们来 验证结论的 第2条: 分析结论:第2条,this 指向 “其执行上下文的环境对象”; 首先,明确一点,执行上下文(execution context) 跟 作用域(scope) 是两个概念执行上下文:注意这个执行上下文是个名词,不是动词,它相当于一个程序执行器,拿函数举例,每次调用函数时,都会创建一个这样的执行器, 它分为 创建阶段 和 执行阶段 两个阶段,也可以比喻为,执行器被创建出来的阶段 和 执行器被使用时的阶段; 两个阶段分别做了不同的事情: 创建阶段:创建变量对象、建立作用域链、确定 this指向 执行阶段:变量赋值、函数引用、执行代码 程序执行完毕之后,这个执行器会被弹出程序执行的流水线 调用栈(call stack); 作用域:是变量和函数可访问的一个区域范围; 作用域链:就是从自身作用域开始一直向上查找它的父级作用域,直至查找到全局作用域 而形成的一个链条,这就是作用域链; 访问变量的过程,是一个 从子到父查寻作用域链上变量对象的查找过程; 需要注意一点,这个查找过程是单向的,也就是说,子可以找到父作用域内的变量对象,而父不可以访问子作用域内的变量对象; 好像有点说多了,只要记住 执行上下文 和 作用域是两个概念就好了; 现在,现在我们了解了执行上下文到底是怎么回事儿了,那么,执行上下文的“环境对象”又是什么意思呢,上文我们把执行上下文比喻成 执行器, 那么这个 "环境对象",就相当于生产执行器的 厂家,并且在制造这个生成器的时候,就给它贴上了商标,也就是确定了 this的指向; 概念介绍完了,目的也就是让大家有个清除的概念意识,接下来我们做点实际的,那到底怎么判断 执行上下文的环境对象到底是什么呢? 我将总结的情况分了以下五类: 1.全局上下文中 this 2.函数上下文的 this 3.对象属性中的 this 4.构造函数 和 原型方法中的 this 5.应用 call、apply、bind 方法后的 this */

原创:转载注明出处,谢谢 :)

this指向 - 开端的更多相关文章

  1. ej3-0开端

    开始 编码多年,总有一些最佳实践,Java也是,比如设计模式,比如Effective Java 3 (ej3) . 设计模式先后看过<大话设计模式>,<HeadFirst 设计模式& ...

  2. ndk学习之C语言基础复习----结构体、共用体与C++开端

    自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...

  3. 30天的php学习之路——第一天开端

    因项目紧急只留给了我4周时间学习php.谨以此文记录我的php学习历程,仅供参考,若有错误请指正. 之前对php有过一些了解,一些语法和习惯和C#差距有些大,所以第一天准备对php中的符号有个全面的了 ...

  4. C语言中 指向函数的指针 简介

    引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* ...

  5. JS this指向

    正常模式 在正常模式下独立函数的的 this 指向 undefined 或 window. <script type="text/javascript"> functi ...

  6. F#之旅0 - 开端

    F#之旅0 - 开端 UWP的学习告一段落,CozyRSS的UWP版本并没有做.UWP跟wpf开发几乎一模一样,然后又引入了很多针对移动设备的东西,这部分有点像android.没啥太大的意思,不难,估 ...

  7. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  8. 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题

    setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...

  9. what's this? 浅谈js中this的指向问题

    刚刚学习js的朋友可能和我一样,看到代码中的this总是一脸懵逼,不知道this到底指向谁.经过一段时间的了解,我想跟大家分享下自己的理解. 何时出现this 函数在调用的时候,会自动获得两个特殊变量 ...

随机推荐

  1. cocos2d-x游戏引擎核心之三——主循环和定时器

    一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...

  2. 百度地图地址查询API使用

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgsAAALxCAIAAABdNHLmAAAgAElEQVR4nOy9/VMbZ5rvnf/hbM7zy3 ...

  3. js基础---->js中的消息框

    可以在JavaScript 中创建三种消息框:警告框.确认框.提示框.今天我们就这几个框做一个介绍.我们笑着说再见,却深知再见遥遥无期. javascript消息框 一.警告框:警告框经常用于确保用户 ...

  4. LeetCode——Product of Array Except Self

    Description: Given an array of n integers where n > 1, nums, return an array output such that out ...

  5. Linux显示不了中文

      原文:https://www.cnblogs.com/hooly/p/8615384.html 版权所有:归属原文作者!!!  查看当前系统默认采用的字符集: # locale 在RedHat/C ...

  6. 关于Visual Studio 20**自动添加头部注释信息

    作为一个万年潜水党,不管这一篇文章技术含量如何,也算是一个好的开始吧.   在日常的开发中我们经常需要为类库添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们 ...

  7. oracle缩写与术语

    术语 定义活动会话池 资源组或子计划允许的当前活动会话数ADDM Automatic Database Diagnostic Monitor(自动数据库诊断监视程序)ASM Automatic Sto ...

  8. Java定时器和Quartz使用

    一.Java普通自定义定时器 /** * 自定义一个定时器 * @author lw */ public class MyTimer extends Thread{ private Long time ...

  9. Xshell配置ssh免密码登录-密钥公钥(Public key)

    1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1 ...

  10. 170509、文本编辑器编写的shell脚本在linux下无法执行的解决方法

    今天碰到一个奇怪的问题,编写好的shell脚本再linux上执行一直提示找不到文件或目录,后来想想是文本编辑器的问题,记录下来!!! 1.查看当前文本格式 Notepad++界面中,在右下角有文件格式 ...