近期进修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. Warning: File `src/core/nginx.h' has modification time 1.2e+07 s in the future

    Nginx安装时Warning: File `src/core/nginx.h' has modification time 1.2e+07 s in the future问题的解决方法 问题场景: ...

  2. POJ3463 Sightseeing

    题目大意:求两点间最短路与长度为最短路长度+1的路径的条数之和. 方法1:最短路径+DP 首先求出ST间最短路径,然后根据递归式记忆化搜索(因此还要构造反向图). 我们知道到达终点的路径长度最长为ma ...

  3. usb键鼠驱动分析【钻】

    本文转载自:http://blog.csdn.net/orz415678659/article/details/9197859 一.鼠标 Linux下的usb鼠标驱动在/drivers/hid/usb ...

  4. spring框架spring之HibernateTemplate

    转自:https://blog.csdn.net/acmman/article/details/44652207

  5. express 4.2.0 使用session和cookies

    express 4.2.0 使用session和cookies https://my.oschina.net/u/1466553/blog/294336

  6. javascript中对象属性的介绍

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Google浏览器“无法添加来自此网站的应用、扩展程序和应用脚本”的解决办法

    原文链接:https://blog.csdn.net/Fan_Weibin/article/details/80402790 解决方法如下: 在桌面找到Google Chrome图标→右击属性→在快捷 ...

  8. html IMG 标签水平居中 ,和图片过大 溢出处理

    max-width: 100%;//父元素的宽度 display: block; margin: 0 auto; display: table-cell; 垂直居中 vertical-align: m ...

  9. C# treeView 控件

    #region --基础 ////设置目录树 ////添加根节点 //treeView1.Nodes.Add("0000000"); ////添加子节点 ////treeView1 ...

  10. git入坑随笔

    一直以来,都喜欢用git做版本管理,主要涉及平台是coding, github以及公司自己搭建的gitlab. 因为一直以来都是自己一个人维护前端的项目,所以基本上很少有冲突的情况.(手动微笑 :) ...