前端面试之JavaScript中的闭包!

闭包

闭包( closure )指有权访问另一个函数作用域中变量的函数。 ----- JavaScript 高级程序设计

闭包其实可以理解为是一个函数

简单理解就是,一个作用域可以访问另外一个函数内部的局部变量。

  1. <script>
  2. // 闭包(closure)指有权访问另一个函数作用域中变量的函数。
  3. function fn() {
  4. var num = 29;
  5. function fn2() {
  6. console.log(num); // 29
  7. }
  8. fn2();
  9. }
  10. debugger
  11. fn();
  12. </script>

闭包就是当前作用域可以访问另一个函数的作用域中的局部变量!另一个函数就叫做闭包函数!也就是说产生了闭包!

被访问的这个变量的这个函数就叫做闭包函数!

闭包的作用!

闭包的作用:延伸了变量的作用范围!

  1. // 闭包(closure)指有权访问另一个函数作用域中变量的函数。
  2. // 一个作用域可以访问另外一个函数的局部变量
  3. // 我们fn外面的作用域可以访问fn内部的局部变量
  4. function fn() {
  5. var num = 29;
  6. // function fn2() {
  7. // console.log(num); // 29
  8. // }
  9. // return fn2; // 把fn2这个函数返回回去!
  10. // 简化
  11. return function () {
  12. console.log(num); // 29
  13. }
  14. }
  15. var f = fn(); // f接收的就是一个函数, 那么我们调用他不就可以实现外面的作用域可以访问fn内部的局部变量了嘛!
  16. f(); // 29

闭包的案例

点击li输出当前li的索引号

  1. // 闭包应用-点击1i输出当前1i的索引号
  2. // 闭包应用-点击1i输出当前1i的索引号
  3. // 我们可以利用动态添加属性的方式
  4. var lis = document.querySelector('.nav').querySelectorAll('li');
  5. // for (var i = 0; i < lis.length; i++) {
  6. // lis[i].index = i;
  7. // lis[i].onclick = function () {
  8. // console.log(this.index)
  9. // }
  10. // }
  11. // 2.利用闭包的方式得到当前小li的索引号
  12. for (var i = 0; i < lis.length; i++) {
  13. // 利用for循环创建了4个立即执行函数
  14. // 立即执行函数也成为小闭包因为立即执行函数里面的任何个函数都可以使用它的i这变量
  15. (function(i) {
  16. // console.log(i)
  17. lis[i].onclick = function() {
  18. debugger
  19. console.log(i)
  20. }
  21. })(i);
  22. }

闭包应用-3秒钟之后,打印所有1i元素的内容

  1. // 闭包应用-3秒钟之后,打印所有1i元素的内容
  2. var lis = document.querySelector('.nav').querySelectorAll('li');
  3. for (var i = 0; i < lis.length; i++) {
  4. (function(i) {
  5. setTimeout(function() {
  6. console.log(lis[i].innerHTML)
  7. }, 2000)
  8. })(i);
  9. }

计算打车价格

  1. //闭包应用-计算打车价格
  2. // 打车起步价13(3公里内), 之后每多一公里增加 5块钱. 用户输入公里数就可以计算打车价格
  3. // 如果有拥堵情况,总价格多收取10块钱拥堵费
  4. // function fn() {};
  5. // fn();
  6. var car = (function () {
  7. var start = 13; // 起步价 局部变量
  8. var total = 0; // 总价 局部变量
  9. return {
  10. // 正常的总价
  11. price: function (n) {
  12. if (n <= 3) {
  13. total = start;
  14. } else {
  15. total = start + (n - 3) * 5
  16. }
  17. return total;
  18. },
  19. // 拥堵之后的费用
  20. yd: function (flag) {
  21. return flag ? total + 10 : total;
  22. }
  23. }
  24. })();
  25. console.log(car.price(5)); // 23
  26. console.log(car.yd(true)); // 33
  27. console.log(car.price(1)); // 13
  28. console.log(car.yd(false)); // 13

关于闭包的思考题!

下面的函数中有没有产生闭包呢?

  1. var names = 'The Window';
  2. var obj = {
  3. names: 'My obj',
  4. getNameFunc: function() {
  5. return function() {
  6. return this.names;
  7. }
  8. }
  9. }
  10. console.log(obj.getNameFunc()()); // The Window
  11. // Why
  1. var names = 'The Window';
  2. var obj = {
  3. names: 'My obj',
  4. getNameFunc: function() {
  5. var that = this;
  6. return function() {
  7. return that.names;
  8. }
  9. }
  10. }
  11. console.log(obj.getNameFunc()());

前端面试之JavaScript中的闭包!的更多相关文章

  1. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  2. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  3. 一篇文章把你带入到JavaScript中的闭包与高级函数

    在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. funct ...

  4. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  5. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  6. 难道这就是JavaScript中的"闭包"

    其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...

  7. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  8. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

  9. JavaScript中的闭包理解

    原创文章,转载请注明:JavaScript中的闭包理解  By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...

随机推荐

  1. PPT技术干货1(下)——数据图表分析、逻辑梳理、高效办公

    数据分析 让数据指导决策,帮你获得业绩增长 数据展示是PPT必备的基础技能, 有些人是简单粗暴的将数据直接堆在页面上: 这样的汇报缺乏重点,不具有针对性. 图表该如何设计呢? 1.数据可视化,内容交互 ...

  2. 关于Git的一些常规操作

    最近刚换了新的办公电脑,Git有重新安装了一遍,很多步骤久了不操作就忘了,又是好一顿折腾,于是这次就顺便记下来了. 不错的Git教程: https://www.liaoxuefeng.com/wiki ...

  3. phaser3入门教程-从零开始开发一个打砖块游戏

    项目代码 项目代码 体验一下 空格开始,左右箭头控制移动 体验一下 Phaser简介 Phaser是一个HTML5游戏框架.它使用了许多HTML5 API,例如Canvas,WebGL,Audio,G ...

  4. Git全栈开发者使用指南

    一.Git基础 1.Git简介 Git是一种分布式版本控制系统,由Linux之父Linus开发. 所谓分布式版本管理系统,就是在每一台机器上都有一个完整的仓库. 2.Git官网 Git官网:git 在 ...

  5. Docker下配置KeepAlive支持nginx高可用

    案例子任务一.安装配置keepalived 步骤1:使用nginx镜像生成nginx-keep镜像 1) 启动nginx容器并进入 docker run -d --privileged nginx / ...

  6. el-input限制只能输入数字(开发小记)

    输入框中限制通常有三种处理方法 第一种:设置type属性(不推荐) 设置type属性为number,text等等,此方法输入框的后面会有不必要样式出现 <el-input type=" ...

  7. YGGL.sql

    (将表复制粘贴至记事本,再用source命令导入到数据库中) CREATE TABLE `departments` ( `部门编号` char(3) NOT NULL COMMENT '部门编号', ...

  8. Liunx运维(十)-网络管理命令

    文档目录: 一.ifconfig:配置或显示网络接口信息 二.ifup:激活网络接口 三.ifdown:禁用网络接口 四.route:显示或管理理由表 五.arp:管理系统的arp缓存 六.ip:网络 ...

  9. AtCoder Beginner Contest 188 F - +1-1x2 思维题

    题目描述 给你两个数 \(x\),\(y\) 可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作 问最少操作多少次后变为 \(y\) \(x,y \leq 10^{18 ...

  10. ORA-39700: database must be opened with UPGRADE option【转】

    1. 错误 数据库升级后(从11.2.0.1升级到11.2.0.4)启动报错 SQL> startup ORACLE instance started.   Total System Globa ...