理解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 ...
随机推荐
- 释放Windows C盘空间 -- 虚拟内存和休眠文件
本文由Suzzz原创,发布于 http://www.cnblogs.com/Suzzz/p/4111718.html ,转载请保留此声明. 项目组有一Windows工作站, 由于需要使用Kinect最 ...
- bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree.注意gauss里的 ...
- Dubbo入门之一:实例1
原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1. 概述 Dubbo是一个分布式服务 ...
- HTML5一些元素的整理
address元素: 定义和用法 <address> 标签定义文档或文章的作者/拥有者的联系信息. 如果 <address> 元素位于 <body> 元素内,则它表 ...
- CountDownLatch的介绍和使用
1.类介绍 java.util.concurrent 类 CountDownLatch java.lang.Object java.util.concurrent.CountDownLatch 一个同 ...
- JavaScript基本概念A
简介 如果需要了解这些概念, 您应该熟悉 JS 的基本知识. 弱类型 在也无需绞尽脑汁觉得到底采用 float.double,int 还是 short 或是 long 还是 String.只需这样定义 ...
- js中的执行环境和作用域链
首先介绍一些即将用到的概念: 执行环境: 它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中. 所有javasc ...
- C语言学习笔记--内存分区
1. 程序中的栈 1.1 栈的简介 (1)栈中现代计算机程序里最为重要的概念之一 (2)栈在程序中用于维护函数调用上下文 (3)函数中的参数和局部变量存储在栈上 (4)栈保存了一个函数调用所需的维护信 ...
- C#高级参数params的使用
params,可变参数,使用十分简单,看代码吧. using System; using System.Collections.Generic; using System.Linq; using Sy ...
- ascii#ascii,对象类中找__repr__,获取其返回值
#!/usr/bin/env python #ascii,对象类中找__repr__,获取其返回值 class Foo : def __repr__(self): return "hello ...