JavaScript之this释疑

最近进修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种,下面将逐一介绍。原书作者强调某些场景下四种情况可能会有某两个或者三个都适用,需要排列效用的强度大小,这一点,我不太赞同,我觉得还是都可以归并到某一种场景的。

new关键字

JavaScript里面new关键字后接一个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

时间: 2024-09-30 19:50:26

JavaScript之this释疑的相关文章

Javascript高级应用与实践pdf

下载地址:网盘下载 内容简介: 本书的内容涵盖大量提升javascript性能的一些技巧.鲜为人知的写法,以及javascript在web项目中某些智能的.经典的设计.本书在讲解过程中会有大量的例程和各种写法运行耗时的性能比较,给你展示了如何优化javascript的性能.一些非常独特而又能提升javascript性能的技巧(涵盖了当前网络中流行的javascript框架的大多数技巧)以及每天海量交易项目的javascript相关经验.其中,很多经验性的思想描述和方法可以应用于各种语言的编程.另

JavaScript正则表达式学习笔记之一 - 理论基础

自从年前得空写了两篇文章之后就开始忙了,这一忙就是2个月??.当时信誓旦旦说的定期写篇博客的计划也就泡汤了??,不过好在最近有空,顺便总结一下这两个月遇到的几个问题.第一个问题就是项目中用到了一些正则才发现之前被自己忽略的正则是时候补一补了.恰逢今天周六??,就把自己学习JavaScript正则表达式的笔记整理成文,写了这篇关于正则表达式理论基础的文章,希望本文能对有需要的同学提供帮助.号外:本文相对基础,大神请忽略??. 一. 基本概念 正则表达式是用于匹配字符串中字符组合的模式. 一种几乎可

深入浅出 JavaScript 关键词 -- this

前言 虽然都是活动,但可以采用不同的玩法.犹如工作也是一样.今日早读文章由腾讯@老教授翻译授权分享. 正文从这开始- 要说 JavaScript 这门语言最容易让人困惑的知识点,this 关键词肯定算一个.JavaScript 语言面世多年,一直在进化完善,现在在服务器上还可以通过 node.js 来跑 JavaScript.显然,这门语言还会活很久. 所以说,我一直相信,如果你是一个 JavaScript 开发者或者说 Web 开发者,学好 JavaScript 的运作原理以及语言特点肯定对你

Javascript中call的使用

call 方法应用于:Function 对象调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数:thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 G

你不知道的javascript 之 >>

?远大于符号 在数学公式中,">>"代表远大于符号,表示一个数远大于另一个数,如76>>3,-2>>-99等.庞加莱与波莱尔1901年首先使用了它,很快被数学界所接受,沿用至今. 折叠编辑本段右移运算符 在许多计算机编程语言(例如:C语言.C++语言.Java语言.JavaScript语言.Pascal语言等)中,">>"代表右移运算符,就相当于"shr".该运算符为双目运算符,结合方向为从左到右,

初识JavaScript

JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能.因为JavaScript兼容于ECMA标准,因此也称为ECMAScript. ECMAScript,描述了该语javascript组成言的语法和基本对象. 文档对象模型(DOM),描述处理网页内容的方法

最全解析如何正确学习JavaScript指南,必看!

划重点 鉴于时不时,有同学私信问我:怎么学前端的问题.这里统一回复一下,如下次再遇到问我此问题同学,就直接把本文链接地址发给你了. "前端怎么学"应该因人而异,别人的方法未必适合自己.就说说我的学习方法吧:我把大部分时间放在学习js上了.因为这个js的学习曲线,先平后陡.项目实践和练习啥的,我不说了,主要说下工作之外的时间利用问题.我是怎么学的呢,看书,分析源码.个人这几天统计了一下,前端书籍目前看了50多本吧,大部分都是js的.市面上的书基本,差不多都看过. 第一个问题:看书有啥好处

JavaScript数据类型检测

一.JavaScript 数据类型 1.基本数据类型(6种) Undefined Null Boolean Number String Symbol (ES6新增) 2.引用数据类型: Object 二.数据类型检测 1. typeof 可以检测除null 外的基本类型.null 和所有对象的typeof都是"object", 不能用于检测用户自定义类型. 比如Date, RegExp, Array, DOM Element的类型都是"object". var s

JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的undefined值</h3> <script type="text/javascript"> function sayHi(){ console.log("Hi"); }; sayHi(); function sayName(name,age){