理解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 ...
随机推荐
- 超时 CS-8610 中性笔
超时 CS-8610 中性笔 最初觉得这款笔很简单,而且还认为有点丑,因为笔头比较短. 比较特别提这款中性笔比一般的中性笔要粗一点. 使用后才发现比其它的中性笔好用,因为笔杆粗,手感好,笔杆上并没有特 ...
- 洛谷【P2024】[NOI2001]食物链
浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://www.luogu.org/problemnew/show/P202 ...
- WPF中ItemsControl绑定到Google ProtocolBuffer的结构体时的性能问题
背景: 最近遇到一个DataGrid的性能问题:里面大概有4000个数据, 绑定的ItemSource的类也只有一层数据,即简单的List(里面每个是Protocol Buffer自动产生的一个类,1 ...
- Linux驱动多线程 - 互斥量
1.内核多线程相关内容 1.1 头文件#include <linux/kthread.h> 1.2 定义/初始化变量 struct mutex SPI_work; /*定义互斥体*/ mu ...
- java的reflection和introspector
JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制 ...
- 第九课 go的循环语句
1 for语句的三种形式 /* for 循环 */ ; a < ; a++ { fmt.Printf("a 的值为: %d\n", a) } var a, b int = 1 ...
- 通过phpMyAdmin拿webshell
general_log默认为关闭的,root权限开启后,general_log_file会保存所有的查询语句 所以可以开启general_log,然后设置general_log_file为一个php文 ...
- 12-01JavaScript事件(Events)
JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. 2.属性(当这些事件的属性发生时,会触发function{}的函数): 1)ona ...
- 问题:C#将base64转换成二进制图片;结果:c# Base64编码和图片的互相转换代码
c# Base64编码和图片的互相转换代码 Base64编码在Web方面有很多应用,譬如在URL.电子邮件方面.网上有很多相关的资源用于提供Base64编码和其他编码的转换,.Net Framewor ...
- ffmpeg添加水印的方法举例 (砖)
网上大部分关于ffmpeg加视频水印的方法还是使用vhook,在现在的ffmpeg中已经不推荐使用,但是也能编译,也能使用,至于效果,一会再说.现在的ffmpeg推荐使用的是libavfilter,但 ...