前端面试之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. OSM地图本地发布-如何生成各省市矢量地图

    目录 1.缘起 2.问题 3.分析 4.生成自定义地区矢量瓦片 4.1.启动docker 4.2.启动postGIS容器 4.3.设置不清理上次的结果 4.4.删除默认切图范围 4.5.修改切图层级和 ...

  2. Spring Cloud正式移除Hystrix、Zuul等Netflix OSS组件

    1. 前言 2020-12-22日Spring官方博客宣布,Spring Cloud 2020.0.0正式发布.2020.0.0是第一个使用新的版本号命名方案的Spring Cloud发行版本.在此之 ...

  3. vSphere Esxi 6.x 常用序列号

    以下资料转载于互联网公开资料,不得用于商业用途,仅做学习交流. vSphere 6 Enterprise Plus1F6XH-8VJ9L-481Y9-L835P-CFHHA1G28U-AW18P-08 ...

  4. MySQL如何优雅的删除大表

    前言 删除表,大家下意识想到的命令可能是直接使用DROP TABLE "表名",这是初生牛犊的做法,因为当要删除的表达空间到几十G,甚至是几百G的表时候.这样一条命令下去,MySQ ...

  5. 关于 Softmax 回归的反向传播求导数过程

    对于 \(Softmax\) 回归的正向传播非常简单,就是对于一个输入 \(X\) 对每一个输入标量 \(x_i\) 进行加权求和得到 \(Z\) 然后对其做概率归一化. Softmax 示意图 下面 ...

  6. NIO 的工作方式

    NIO 的工作方式 BIO 带来的挑战 BIO : BIO 通信模型,通常由一个独立的 Acceptor 线程负责监听客户端的连接,接受到请求之后,为每个客户端创建一个新的线程进行链路处理,处理完成之 ...

  7. 设置Safari禁止访问某个网站

    经过调查有三种方法可以做到:1,创立新的登录账户,然后进行家长控制:2,安装第三方的应用软件Self Control:3,其他方式 推荐大家使用下面的这个方式:三步即可 1:打开访达(Finder), ...

  8. 解决npm ERR!

    一:[Unexpected end of JSON input while parsing near]报错 最近的vue项目中在执行 npm install 时会报错误: npm ERR! Unexp ...

  9. 一次MySQL死锁的排查记录

    前几天线上收到一条告警邮件,生产环境MySQL操作发生了死锁,邮件告警的提炼出来的SQL大致如下. update pe_order_product_info_test set end_time = ' ...

  10. SpringBoot框架中解决日期展示问题

    解决日期展示问题(返回的json中日期的格式是:"birthday":"1988-08-07T15:00:00.000+0000");需要转化成指定的格式(年月 ...