标签:

it

 

js闭包的作用域以及闭包案列的介绍:
 
首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处?
闭包是为了更方便我们在处理js函数的时候会遇到以下的几种情况:
 
列1:
function f1(){var a=1;f2();}
function f2(){return a;}
f1();//a没有定义
 
或者说我想调用一个全局变量的时候却发现不能调用,或者没有这个变量,没有定义这个变量,还要在想调用的时候不能重复出现,怎么办呢?所以就有了闭包的出现?js闭包给我们更方便的提供怎么在js里去处理一个全局的变量或者全局的方法,下面我们来了解下闭包怎么去用?
 
比如说:
 
function f(){
var b="b";
return function(){
return b;
}
}
 
上面的代码是一个简单的闭包,我们很明显的看到在方法的内部有一个变量(var b),这个b就是在f()方法里的全局变量,也就是说我只要在f()方法的内部都可以调用它,而 return function(){ return b;}是f()方法的作用域,这个作用域是为了方便我们在调用f()方法下面的b的时候让b保留在输出的方法内部;
function f(){
var b="b";
return function(){
return b;
}
}
f()();
 
这样一来我们在调用f()输出b的时候就不会出现调用不到或者是在同一个方法中不想调用时重复出现的情况;很简单吧!!!
 
官方的结论:我们就可以说当一个函数指向了它的父作用域,就可以称之为闭包。
 
下面在给你们提个问题:
 
function f(arg){
var n =function(){
return arg;
}
arg++;
return n;
}
var m= f(123);
m();//124
 
上面是一个js的闭包,你能告诉我他的父作用域和子作用域吗?
不能说没关系,加我QQ我慢慢给你说(654028913)
 
怎么用闭包在循环中的应用?
 
来看一个错误的js闭包的介绍:
function f(){
var a =[];
var i;
for(i=0;i<3;i++){
a[i] = function(){
alert(i);
return i;
}
}
return a;
}
 
var a = f();
a[0]();//3
a[1]();//3
a[2]();//3
 
知道为什么是错误的吗?
照常理来说我们理想的值应该是0,1,2;但是却不是的,为什么呢?其实我们在循环的过程中忘记做一件事,那就是去保留原来在数组a[i]的值,它没有保留原来的值,而是把原来的值拿去循环了,所以循环后的最终结果就是a[i]要输出的最终结果,那我们要怎么正确的去写呢?来看代码:
 
function f() {
var a = [];
var i;
for(i = 0; i < 3; i++) {
a[i] = (function(x){
return function(){
alert(x);
return x;
}
})(i);
}
return a;
}
var a = f();
a[0]();//0
a[1]();//1
a[2]();//2
 
想知道为什么对了吗?我们可以看到,这串代码和刚才的代码我们多添加一个输出的方法,那是该闭包最后执行的作用域,我们把循环的结果都保存到(return function(){
alert(x);
return x;
})里面去这样一来我们的想要输出i的值就可以通过该闭包去输出,x是干什么的很多初学js的人不知道,没关系,x其实是我想代替i去执行的局部变量,明白了吧,是不是很简单啊,你们有没有发现父作用域和原来的不一样了,其实不是的,我只是在输出之前让i执行了一个自调用函数,不懂自调用函数的可以到时候问我,或者到官方js论坛去看;如果不明白上面的不要紧,我们来写个更简单的吧!!!看好了哦
 
function f() {
function makeClosure(x) {
return function(){
return x;
alert(x);
}
}
var a = [];
var i;
for(i = 0; i < 3; i++) {
a[i] = makeClosure(i);
}
return a;
}
 
 

js闭包的作用域以及闭包案列的介绍:的更多相关文章

  1. JS教程:词法作用域和闭包 (网络资源)

    varclassA = function(){ ; } classA.prototype.func1 = function(){ var that = this, ; function a(){ re ...

  2. JS中的作用域和闭包

    作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是 ...

  3. 【详解】JS中的作用域、闭包和回收机制

    在讲解主要内容之前,我们先来看看JS的解析顺序,我们惯性地觉得JS是从上往下执行的,所以我们要用一个变量来首先声明它,来看下面这段代码: alert(a); var a = 1; 大家觉得这段代码有什 ...

  4. JS中的作用域及闭包

    1.JS中的作用域 在 es6 出现之前JS中只有全局作用域和函数作用域,没有块级作用域,即 JS 在函数体内有自己的作用域,但是如果不是在函数体的话就全部都是全局作用域.比如在 if.for 等有 ...

  5. 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】

    一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...

  6. 【 js 基础 】作用域和闭包

    一.编译过程 常见编译性语言,在程序代码执行之前会经历三个步骤,称为编译. 步骤一:分词或者词法分析 将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元. 例子:  var a = 2 ...

  7. 你不知道的js异步、作用域、闭包

    例题如下: for (var i = 0; i < 3; i++) {     setTimeout(function() {         console.log(i);     }, 0) ...

  8. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

  9. 那些年我们一起过的JS闭包,作用域,this,让我们一起划上完美的句号。

    之前有写过闭包,作用域,this方面的文章,但现在想想当时写的真是废话太多了,以至于绕来绕去的,让新手反而更难理解了,所以就有了此篇文章,也好和闭包,作用域,this告一段落. 第一个问题:什么是闭包 ...

随机推荐

  1. 如何捕捉并分析SIGSEGV的现场

    linux下程序对SIGSEGV信号的默认处理方式是产生coredump并终止程序,可以参考man 7 signal Signal Value Action Comment ───────────── ...

  2. Facebook不相信所谓的员工能力等级。《长效商业英雄》(《哈佛商业评论》2016年11期),4星。

    老牌管理杂志.本期我给4星.以下是书中一些信息的摘抄: 1:爱因斯坦曾说:“任何傻瓜都能让事情更复杂,只有天才能让事情变简单.”单就这一点来看,乔布斯无疑是天才中的天才.#137 2:通过让苹果聚焦于 ...

  3. segments&cache

    Segments 执行效果 命令  在 sense 里边执行  GET /abcd/_segments  前边的是索引名称,后边是请求 段信息 说明  索引是面向分片的,是由于索引是由一个或多个分片( ...

  4. Codeforces Round #378 (Div. 2)

    A: 思路: 水题,没啥意思; B: 思路: 暴力,也没啥意思; C: 思路: 思维,可以发现从前往后和为b[i]的分成一块,然后这一块里面如果都相同就没法开始吃,然后再暴力找到那个最大的且能一开始就 ...

  5. Hibernate入门

    脏检查及刷新缓存机制: 脏检查:当事物提交时,Hibernate会对session中持久状态的对象进行检测, 判断对象的数据是否发生改变 为什么要进行脏检查? 如果对象发生了改变,就需要将改变更新到数 ...

  6. Hibernate选择题总结

    Hibernate选择题总结 1.在Hibernate中,以下关于主键生成器说法错误的是( ). A.increment可以用于类型为long.short或byte的主键 B.identity用于如S ...

  7. C#事件学习

    通过代码触发事件(第10章).由对象触发的事件(Timer每隔Interval指定时间,就触发Tick事件,第8章使用Timer). 目录: 避免递归事件 访问对象的事件 使用事件参数 创建事件处理程 ...

  8. P1546 最短网络 Agri-Net

    题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其 ...

  9. ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程

    环境:OS X 10.10.5 + JDK 1.8 步骤: 一.下载ELK的三大组件 Elasticsearch下载地址: https://www.elastic.co/downloads/elast ...

  10. LeetCode:Word Ladder I II

    其他LeetCode题目欢迎访问:LeetCode结题报告索引 LeetCode:Word Ladder Given two words (start and end), and a dictiona ...