在了解闭包之前,先了解作用域
一,作用域
简单来说就是变量和函数可以访问的范围,在es5中变量作用域一般分为全局作用域和局部作用域,这个主要依据是全局变量还是局部变量

情景1:
<script>
var global = 'global'
function test () {
var local = 'local'
console.log(global)
}
test() // 返回global
console.log (local) // 报错:Uncaught ReferenceError
</script>
此处的global就是全局变量,在整个代码内都可以访问到这个变量;变量local就是局部变量,只在函数local内部能访问到,在外部无法访问
情景2:
<script>
var global = 'global'
function test () {
local = 'local'
}
test()
console.log(local) // 返回 local
</script>
此处的global和local都是全局变量,在整个代码内都可以访问到这两个变量

情景1和情景2的对比分析:
因为JavaScript作为一门弱类型语言,声明一个变量只需要var一个保留字,如果在函数中不使用var声明变量,该变量将提升为全局变量,这就是为什么情景2中返回的值是local
二,作用域链
JavaScript里面采用的是函数作用域,每一个函数都有一个作用域,也算是一条独立的作用域链。比较典型的就是函数里面嵌套函数

<script>
var result = 'global'
function test () {
var result = 'local'
function inner () {
console.log(result) // 返回local
}
inner()
}
test ()
console.log(result) // 返回global
</script>

以上三段作用域构成作用域链,作用域链的查找顺序:inner本函数-->上一层test函数-->window全局对象,当调用内部的inner方法的时候,里面没有声明变量result,但是可以访问外部函数test的变量,如果外部函数依然没有这个变量,就继续查找全局变量,直到找不到为止,如果找不到的话,就抛出 ReferenceError 错误。通过作用域链,子函数可以访问父函数的变量,但是父函数无法访问子函数里面的变量,闭包就可以解决这个问题。
三,闭包
简单的理解就是有权访问另一个函数作用域中的变量的函数。

闭包理解的误区:
<script>
function test() {
var result = 'local'
return result
}
var res = test()
console.log(res)
</script>

上面的这个是闭包函数么?答案显示是no!以上的函数确实是实现了外部可以访问函数内部的变量result,但是当函数调用完成之后,里面的变量result也就用完了被销毁了,即函数内的局部变量的生命周期仅存在于函数的声明周期内,函数被销毁,函数内的变量也自动被销毁,所以这个函数不是闭包函数

闭包函数的正解,如下:
<script>
function test () {
var result = 'local'
function inner () {
return result
}
return inner
}
var res = test()
console.log(res()) // 返回local
</script>

上面的这段代码不仅实现了外部可以访问函数test内的变量result,同时当函数调用完的时候,通过闭包引用的外层作用域内的变量依然存在,并且将一直存在,直到执行的闭包作用域被销毁
四,闭包的特点
1,可以读取函数内部的局部变量
2,局部变量的值可以存在内存中,可以反复使用,并且不存在全局变量的污染问题
3,占用更多的内存,不容易被释放

应用场景如下:
<script>
function count() {
var num = 0
function inner () {
return num+=1
}
return inner
}
var result = count()
console.log(result()) // 返回1
</script> 

作用域&&闭包的更多相关文章

  1. JavaScript作用域闭包简述

    JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...

  2. 读《你不知道的JavaScript(上卷)》后感-作用域闭包(二)

    github原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们, ...

  3. 你不知道的JS之作用域和闭包(五)作用域闭包

    原文:你不知道的js系列 一个简单粗暴的定义 闭包就是即使一个函数在它所在的词法作用域外部被执行,这个函数依然可以访问这个作用域. 比如: function foo() { var a = 2; fu ...

  4. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  5. js 函数 作用域 全局作用域 局部作用域 闭包

    一个变量没有声明但调用 直接报错,声明没有赋值会显示未定义. 作用域 作用域(scope):一条数据可以在哪个范围中使用. 通常来说,一段程序代码中所用到的数据并不总是有效/可用的,而限定这个数据的可 ...

  6. python基础(7)-函数&命名空间&作用域&闭包

    函数 动态参数 *args def sum(*args): ''' 任何参数都会被args以元组的方式接收 ''' print(type(args)) # result:<class 'tupl ...

  7. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  8. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...

  9. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

随机推荐

  1. Codeforces 438E The Child and Binary Tree - 生成函数 - 多项式

    题目传送门 传送点I 传送点II 传送点III 题目大意 每个点的权值$c\in {c_{1}, c_{2}, \cdots, c_{n}}$,问对于每个$1\leqslant s\leqslant ...

  2. css的再深入7(更新中···)

    1.transparent  透明的 2.placeholder  提示语 写页面 搞清结构层次, 保证模块化,让他们之间不能受到影响 (1) 元素性质 (2) 标准流 浮动带来的脱离文档流撑不起父级 ...

  3. C# 计算位置居中

    (item.Height / 2 - lab.Height / 2)

  4. VR外包团队—国内首家VR虚拟现实主题公园即将在北京推出

    期,美国“The VOID”.澳洲“Zero Latency”两大虚拟现实主题乐园让许多爱好者兴奋至极,门票据说都已经预约到明年2月!在如此巨大的商机面前,谁将抢到国内VR虚拟现实主题公园第一块蛋糕? ...

  5. 画一条0.5px的线

    通过伪类元素:after为其添加样式,用transform:scaleY令其在垂直方向缩小0.5倍 .div:after{ height: 1px; transform: scaleY(0.5); t ...

  6. python_入门_三级菜单

    '''程序:三级菜单要求:1.打印省.市.县三级菜单2.可返回上一级3.可随时退出程序''' # -*- coding: utf-8 -*- # __author__ = 'qi' prov_city ...

  7. 在Eclipse下搭建Hibernate框架(加载hibernate工具插件,离线)

    下载hibernate工具包完成之后,对其进行解压可以得到众多文件夹,其中就有一个jbosstools-hibernate开头的文件夹,进入其中可以得到features和plugins两个文件夹,在E ...

  8. CRM INBOX 查询结果增强字段

    参考:https://blogs.sap.com/2013/03/25/how-to-integrate-new-result-list-attributes-into-the-agent-inbox ...

  9. jQuery.ready() 函数详解

    jQuery.ready() 函数详解 ready()函数用于在当前文档结构载入完毕后立即执行指定的函数. 该函数的作用相当于window.onload事件. 你可以多次调用该函数,从而绑定多个函数, ...

  10. Python—列表操作

    列表 列表的使用: 列表是可变数据类型,因此列表的方法,都是直接修改列表原始值 list = ["panda","chimpanzee","zebra ...