理解JavaScript普通函数以及箭头函数里使用的this
this
普通函数的this
普通函数的this是由动态作用域决定,它总指向于它的直接调用者。具体可以分为以下四项:
- this总是指向它的直接调用者, 例如 obj.func() ,那么func()里的this指的是obj。
- 在默认情况(非严格模式,未使用 'use strict'),如果函数没有直接调用者,this为window
- 在严格模式下,如果函数没有直接调者,this为undefined
- 使用call,apply,bind绑定的,this指的是绑定的对象
箭头函数的this
箭头函数是没有绑定自己的this,函数内使用的this是由静态作用域(也成为词法作用域,参考this)决定。静态作用域就是说箭头函数里this是由定义它的代码决定,而不是执行调用箭头函数的代码。
上面的说法有时很难理解,我自己总结的方法是:找出定义箭头函数的上下文(即包含箭头函数最近的函数或者对象),那么上下文所处的父上下文即为this。具体可以参考箭头函数的示例。
普通函数示例
示例1:对象函数的this
var obj = {
myfunc : function() {
console.log(this);
}
}
obj.myfunc();
输出的是obj对象,this指的是obj。
示例2:全局函数的this
function myfunc() {
console.log(this);
}
myfunc();
输出的是Window对象,this指的是Window
示例3:严格模式下全局函数的this
'use strict';
function myfunc() {
console.log(this);
}
myfunc();
this为undefined,因为严格模式下,myfunc没有直接的调用者。
示例1-变形1:在obj.myfunc()方法里添加普通函数,并执行
var obj = {
myfunc : function() {
function innerfunc() {
console.log(this);
}
innerfunc();
}
}
obj.myfunc();
this指的是Window。这是因为innerfunc()函数执行时没有直接调用者,所有this为Window。
示例1-变形2:把obj.myfunc赋值给一个变量后调用
var obj = {
myfunc : function() {
console.log(this);
}
}
var f = obj.myfunc;
f();
this指的是Window。这是因为f()是没有直接调用者,在非严格模式下,this指的是Window。
箭头函数示例
示例5:函数内使用箭头函数
var obj = {
myfunc : function(){
var f = ()=>{
console.log(this);
}
f();
}
}
obj.myfunc();
this指的是obj。因为定义箭头函数的上下文为myfunc函数,myfunc函数所在的父上下文为obj。
示例6:箭头函数作为方法
var obj = {
myfunc : ()=>{
console.log(this);
}
}
obj.myfunc();
这个地方很容易误以为this指的是obj。其实this实际指的是window,因为定义箭头函数最近的上下文为obj对象(myfunc和箭头函数作为key-value的形式是平级),而obj对象的父上下文为window。
按MDN web docs里说的,建议箭头函数仅用在非方法的函数(non-method function)里。
示例7:
var outeobj = {
outfunc:function() {
var obj = {
myfunc : ()=>{
console.log(this);
}
}
obj.myfunc();
}
}
outeobj.outfunc();
为了和示例6做对比,现在把obj对象添加到outerobj的outfunc里。
this指的是outobj。这是因为箭头函数最近的上下文为obj对象,而obj对象的父上下文为outobj。
理解JavaScript普通函数以及箭头函数里使用的this的更多相关文章
- JavaScript初学者必看“箭头函数”
译者按: 箭头函数看上去只是语法的变动,其实也影响了this的作用域. 原文: JavaScript: Arrow Functions for Beginners 译者: Fundebug 为了保证可 ...
- JavaScript:学习笔记(5)——箭头函数=>以及实践
JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...
- JavaScript中的普通函数和箭头函数
最近被问到了一个问题: javaScript 中的箭头函数 ( => ) 和普通函数 ( function ) 有什么区别? 我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答 ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- 深入理解javascript中的立即执行函数
这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见,需要的朋友可以 ...
- JS中的普通函数和箭头函数
最近被问到了一个问题: >javaScript 中的箭头函数 (=>) 和普通函数 (function) 有什么区别? 我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答 ...
- 理解javascript中的立即执行函数(function(){})()
之前看了好多代码,都有用到这种函数的写法,但是都没认真的去想为什么会这样写,今天开始想学习下jquery的源码,发现jquery也是使用这种方式,用(function(window, undefine ...
- 理解JavaScript中的去抖函数
何为去抖函数?在学习JavaScript去抖函数之前我们需要先弄明白这个概念.很多人都会把去抖跟节流两个概念弄混,但是这两个概念其实是很好理解的. 去抖函数(Debounce Function),是一 ...
- 【转】深入理解javascript中的立即执行函数(function(){…})()
javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( f ...
随机推荐
- DWZ富客户端HTML框架
一.了解 概述:是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. 目的:简单实用.扩展方便(在原有架构基础上扩展方便).快速开发.RIA思路.轻量级 使用:用html扩展的方式来代替 ...
- JVM介绍(一)
1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
- BZOJ3052:[WC2013]糖果公园
浅谈莫队:https://www.cnblogs.com/AKMer/p/10374756.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...
- 六、Jmeter后置处理器JSON Extractor
一.当接口返回是JSON格式的时候,就可以用JSON Extractor来抓取返回的值,用来关联或者断言. 1.首先,到V2EX中找一个接口,地址为:https://www.v2ex.com/p/7v ...
- HDU4825(字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- Spring Boot 集成Swagger2生成RESTful API文档
Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...
- socket模型
Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议). 一台电脑(IP)的一个应用程序(端口) 和 另一台 ...
- Java事务的原理与应用
Java事务的原理与应用 一.什么是Java事务 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (isolation ...
- JDBC---bai
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- Dev控件GridControl实现CheckBox列和ComBox列
1.在sql语句中添加空白行,如select c1,c2 null c3 from xxx; 2.将sql语句查询结果与gdc绑定CmmFrm.BestFitGridViewColumnsWidth( ...