javascript 闭包、this

2016-01-25  js pl

闭包其实很好理解,但是由于经常把this和闭包绑在一起,从而加大了理解的难度,如果将他们分开考虑,那就清晰多了。

闭包

闭包并不是js首创,在许多语言中都支持闭包,如schemer、ruby等。如果没有闭包,像js这样的支持高阶函数特性的语言将是一个噩梦。

  • 静态作用域
  • 动态作用域
var name = "xiaofu";
var person = function(lastname){    var name = 'yang';

    function personName(){        return name + lastname;
    }
    return personName;
}
var pName = person();
pName("xiaoming");

js是函数作用域的,即一个function就是一个作用域,所以personName在person这个函数的作用域里面。但是调用的是在这个作用域的外面,那么当personName执行的时候,它里面的name取的是person这个作用域还是最外层的作用域呢?

如果是静态作用域则调用的是person里面的 name, 如果是动态作用域则调用的是外层的name(“xiaofu”);而不是”yang”。

而闭包就是用来实现静态作用域的一种方式,即通过闭包将函数和它声明时的作用域保存下来,这样在调用的时候取到的就是声明时所在的作用域而不是调用时的作用域。

this

this则与变量有点不同,即this采用的是类似于动态作用域的情况。js里面一切都是对象,所以函数也都是某个对象的方法,如果没有显示指定则是全局对象。

var person = {    fullname: function{        console.log(this);
    },
    printAge: function(){        console.log(this);
    }
}
person.fullname();      //this指向person
var age = person.printAge;
age();                  //this指向window(浏览器中)

将person.printAge赋值给age之后,再执行age(),此时age没有显示指定调用对象则默认是window(浏览器环境)。所以this并不是声明所在的环境。

箭头函数(es6)

es6中新增了箭头函数,箭头函数与通过function声明的函数不同,它的this是使用的声明时上下文中的this.并且不可通过apply, call等改变。

js闭包的理解以及闭包中this的理解相关推荐

  1. linux 文件理解,对linux中文件系统的理解

    首先在linux系统当中一个可被挂在的数据为一个文件系统 1.在安装linux过程中我们要进行磁盘分区,可以分根目录'/','/home','/boot',swap等等这些分区,每一个分区('/(根目 ...

  2. C/C++中宏概念理解

    C/C++中宏概念理解 C/C++中宏概念理解 宏替换是C/C++系列语言的技术特色,C/C++语言提供了强大的宏替换功能,源代码在进入编译器之前,要先经过一个称为"预处理器"的模 ...

  3. python中raw是什么意思_对于Python中RawString的理解

    对于Python中RawString的理解 发布于 2016-01-11 06:56:27 | 100 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对 ...

  4. 对python中axis的理解

    对 p y t h o n 中 a x i s 的 理 解 对python中axis的理解 对python中axis的理解 axis的实际含义是根据axis指定的维度进行连接,如矩阵m1的维度为(2, ...

  5. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南

    js执行环境作用域和闭包 It may seem surprising, but in my opinion the most important and fundamental concept to ...

  6. python闭包和装饰器的区别_深入理解Python中的闭包与装饰器

    函数的装饰器可以以某种方式增强函数的功能,如在 Flask 中可使用 @app.route('/') 为视图函数添加路由,是一种十分强大的功能.在表现形式上,函数装饰器为一种嵌套函数,这其中会涉及到闭 ...

  7. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  8. 你不懂的JS学习笔记(作用域和闭包)

    You don't KnowJS 引语:你不懂的JS这本书github上已经有了7w的star最近也是张野大大给我推荐了一波,阅读过之后感觉对js的基础又有了更好的理解.本来我是从来不这种读书笔记的, ...

  9. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

最新文章

  1. C#.NET 中的类型转换 (转)
  2. 微软官方反间谍流氓软件WindowsDefender
  3. java 不执行构造函数_函数作为构造函数执行,但不作为函数执行
  4. SpringBoot开发案例之整合Spring-data-jpa
  5. Impala 查询导出到文本,本地系统
  6. 查询长期未登录AD的用户
  7. ReentrantLock与synchronized的区别(最直观)
  8. 黄光裕:力争用未来18个月的时间 使企业恢复原有的市场地位
  9. oracle学习笔记(4)
  10. h5 在线语音识别接口
  11. 【转】VC6.0+icc编译STLPort5.2
  12. 附件 计算机 丢失,帮你找回Win7开始菜单附件丢失的工具
  13. 项目管理经验的获取 .
  14. USTC高级软件工程课程学习心得
  15. iOS 实现Lottie动画
  16. 2019年春节春晚红包大战战报!30亿!
  17. Dubbo源码分析(三) -- Dubbo的服务发现源码深入解析4万字长文
  18. Mac M1芯片Android Studio使用模拟器
  19. 记一次摸不着头脑的FullGC问题 (Thumbnails压缩图片占用巨大内存)
  20. JavaCV开发详解之3:通用拉流器实现,从流媒体服务器拉流rtsp/rtmp录制成视频文件

热门文章

  1. 微信小程序 实现换肤功能
  2. AUTOCAD2012安装失败解决方法
  3. OPC服务器软件介绍
  4. Android Studio 模拟器重启(解决模拟器卡死问题)
  5. 【总览】程序员前端、后端资源合集
  6. Android动画完全解析--属性动画
  7. python 最新版本(V3.8.8_32bit)安装教程
  8. android 快速关闭键盘的方法,安卓永久关闭键盘灯的方法
  9. python爬虫 破解js加密有道词典案列的两种方式以及思路总结
  10. 千里姻缘:晒晒你拥有什么样的“恋人指数”