近期进修JavaScript,看了“You Don't Know JS”这本书,认为是本JavaScript内功上乘心法,有一定JavaScript基础朋友一定要看看(不推荐入门小朋友看。怕走火入魔)。

作者知识渊博,理解透彻。行文流畅,案例经典,绝对的大神级人物。

本文将对书中关于JavaScript中this的讲述做一个小结,也会增加一些自己的理解。

算是抛砖。以期引玉。

JavaScript里面this究竟是什么?

this是一个标志符,指向某一个对象或者undefined

JavaScript是什么?一门编程语言;编程语言干嘛的?编写代码。为啥编写代码?运行代码,命令计算机处理事情。好了,写好的JavaScript代码是用来运行的,而且JavaScript Engine会指定一个运行环境(Execution Environment)。运行环境非常复杂,简单来说。能够理解为一个运行数据容器(JavaScript里面能够叫作对象)。JavaScript的代码(一系列的语句)会在两个地方运行,全局区域,以及函数(Function)内部

this就是运行环境里面的一个属性(Property),指向运行所针对的某一个对象

为了描写叙述清楚this和运行环境的关系,简单来说。能够表述例如以下:


Executor_Environment = {
invoke_stack:[statck1, statck2, ...],
params: [param1, param2, ...],
scope_chain:[scop1, scope2, ...],
this: execute_ object,
...
}

继续追问下去。

this指向的对象又是什么?函数调用的时候,this指向的对象是函数执行的上下文,一个目标对象。是执行时由JavaScript Engine动态绑定的

函数里面this的4种场景

函数里面this的绑定情况有4种。以下将逐一介绍。

原书作者强调某些场景下四种情况可能会有某两个或者三个都适用,须要排列效用的强度大小,这一点。我不太赞同,我认为还是都能够归并到某一种场景的。

newkeyword

JavaScript里面newkeyword后接一个Function调用,会新创建一个对象,运行Function的时候,JavaScript Engine会把新创建的对象赋值给this,即此时this指向新创建的对象。以下给出两个样例:

new样例1:


function Func1(){
this.a = 3;
} var a1 = new Func1();
console.log(a1.a); // 3

new样例2:


function Func2(){
this.a = 3;
return {};
} var a2 = new Func2();
console.log(a2.a); // undefined

后面的样例是想说,假设Function里面有return语句。那么new语句新创建的对象会被丢弃!

call和apply

call和apply的作用就是强行指定Function里面this所应该指向的对象。

call的一个小样例:


function sayHi(){
console.log("Hi,"+ this.name);
} var p = {name:"Kevin", age: 26}; sayHi.call(p);

作为对象的属性调用

这里有两层意思。Function是对象的一个属性,通过对象来訪问Function并马上调用。这样的情况下,Function里面的this指向该对象。

样例:


function sayHi(){
console.log("Hi,"+ this.name);
} var p = {name:"Kevin", age: 26, hi: sayHi}; p.hi();

直接调用Function

通过Function的名字,直接调用Function。通常JavaScript Engine会把Global绑定给this。浏览器里面Global是window。只是据说"use strict"情况下,this指向undefined(严格来说undefined在JavaScript里面不是对象)。

Function直接调用的小样例:


function sayHi(){
console.log("Hi,"+ this.name);
console.log(this);
} var name = "Just Joke"; sayHi(); // output:Hi, Just Joke
// followed global object, which contain name, sayHi。

全局区域里面的this代表什么

说实话。我仅仅是推測。全局区域的语句也须要一个运行环境,该运行环境也有一个this标志符,指向Global对象。浏览器里面就是window。这一点“You Don't Know JS”原书中没有提及。

全局区域输入下面代码试试:


var name = "James";
console.log("I am "+ this.name); // I am James

參考链接

You Don't Know JS

JavaScript之this释疑的更多相关文章

  1. 从javascript发展说到vue

    Vue是基于javascript的一套MVVC前端框架,在介绍vue之前有必要先大体介绍下javascript产生背景及发展的历史痕迹.前端MVVC模式等,以便于大家更好的理解为什么会有vue/rea ...

  2. 你不知道的javaScript笔记(5)

    原生函数 常用的原生函数 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol( ...

  3. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  4. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  5. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  6. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  7. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  8. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  9. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

随机推荐

  1. hdoj--2255--奔小康赚大钱(KM算法模板)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. 智能识别收货地址 javascript

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 地址: https://github.com/wzc570738205/smart_parse

  3. linux 添加 msyql 开机自启动

    1.将服务文件拷贝到init.d下,并重命名为mysql cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 2.赋予可 ...

  4. 为什么用Mysql?

    阅读目录 楔子 初识数据库 为什么要用数据库 认识数据库 初识mysql mysql概念 下载和安装 初识sql语句 楔子 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来h ...

  5. BZOJ 2288 贪心 +链表

    思路: 放个题解好吧. http://www.cnblogs.com/zyfzyf/p/4114774.html //By SiriusRen #include <queue> #incl ...

  6. Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射?

    NET[C#]Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射? 问题描述 比如有如下的数据表结构:Person: person_id int first_name va ...

  7. 【android】RxJava1原理解析

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  8. 外观模式(Facade)C++实现

    外观模式 意图: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用. 适用性: 1.在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架 ...

  9. CDR快速制作苹果手机照片小图标

    本篇教程用CorelDRAW快速制作苹果手机照片小图标,在实现的过程中主要使用了旋转复制的方法,加之一些常用工具的用法处理,最后加上透明效果下的合并模式就好了,现在跟小编一起来看看详细的操作吧! 1. ...

  10. Python 数据清洗--处理Nan

    参考:http://blog.sina.com.cn/s/blog_13050351e0102xfis.html https://www.sogou.com/link?url=DOb0bgH2eKh1 ...