前端面试之JavaScript中的闭包!

闭包

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

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

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

 <script>
// 闭包(closure)指有权访问另一个函数作用域中变量的函数。
function fn() {
var num = 29;
function fn2() {
console.log(num); // 29
}
fn2();
}
debugger
fn();
</script>

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

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

闭包的作用!

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

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

闭包的案例

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

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

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

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

计算打车价格

  //闭包应用-计算打车价格

        // 打车起步价13(3公里内),  之后每多一公里增加 5块钱.  用户输入公里数就可以计算打车价格
// 如果有拥堵情况,总价格多收取10块钱拥堵费
// function fn() {};
// fn();
var car = (function () {
var start = 13; // 起步价 局部变量
var total = 0; // 总价 局部变量
return {
// 正常的总价
price: function (n) {
if (n <= 3) {
total = start;
} else {
total = start + (n - 3) * 5
}
return total;
},
// 拥堵之后的费用
yd: function (flag) {
return flag ? total + 10 : total;
}
}
})();
console.log(car.price(5)); // 23
console.log(car.yd(true)); // 33 console.log(car.price(1)); // 13
console.log(car.yd(false)); // 13

关于闭包的思考题!

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

        var names = 'The Window';
var obj = {
names: 'My obj',
getNameFunc: function() {
return function() {
return this.names;
}
}
}
console.log(obj.getNameFunc()()); // The Window
// Why
    var names = 'The Window';
var obj = {
names: 'My obj',
getNameFunc: function() {
var that = this;
return function() {
return that.names;
}
}
}
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. 扫描条形码获取商品信息(iOS 开发)

    一.导入ZBarSDK及其依赖库(这不是本文侧重点)     1.下载地址 https://github.com/bmorton/ZBarSDK     2.导入头文件 #import "Z ...

  2. MySQL误删除用户怎么解决

    前言:在不考虑到原来用户对关联数据库的授权问题的情况下,有以下两种思路解决 #1.安全模式修改 第一步:关闭数据库服务: [root@db01 ~]#/etc/init.d/mysqld stop 第 ...

  3. C++STL教程

    1 什么是STL? STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Libr ...

  4. 深入理解MySQL系列之锁

    按锁思想分类 悲观锁 优点:适合在写多读少的并发环境中使用,虽然无法维持非常高的性能,但是在乐观锁无法提更好的性能前提下,可以做到数据的安全性 缺点:加锁会增加系统开销,虽然能保证数据的安全,但数据处 ...

  5. 深入浅出JVM(一):你写得.java文件是如何被加载到内存中执行的

    众所周知,.java文件需要经过编译生成.class文件才能被JVM执行. 其中,JVM是如何加载.class文件,又做了些什么呢? .class文件通过 加载->验证->准备->解 ...

  6. SpringBoot+Vue 前后端合并部署

    前后端分离开发项目 前端vue项目 服务端springboot项目 如何将vue的静态资源整合到springboot项目里,通过启动jar包的方式部署服务. 前端项目执行npm run build 命 ...

  7. JavaDailyReports10_16

    今天学习安装配置了JavaWeb的资源环境, 明天开始学习HTML!

  8. 原生小程序中实现将scss文件实时编译为wxss文件

    参考链接 全局安装gulp,方便以后直接执行gulp命令 npm install gulp -g 用原生小程序新建一个项目 在小程序根目录(app.js同级目录)中新建package.json文件 n ...

  9. 三目运算符(C++)

    一.简介 固定格式 ?: 三目运算符:可用于赋值语句 三目运算表达式:<表达式1>?<表达式2>:<表达式3> 注:"?"运算符的含义是: 先求 ...

  10. 一张图看懂sql的各种join

    下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法.