词法作用域

词法作用域是指一个变量在源码中声明的位置作为它的作用域。
同时嵌套的函数可以访问到其外层作用域中声明的变量。

函数中的定义的局部变量只能由函数的内部成员访问,而函数中的內部成员可以访问外部元素。

例:

     function main() {
// a 是 main 函数创建的局部变量
var a = 'aaa';
// b() 是函数内部方法,一个闭包
function b() {
alert(a); // 它使用了父函数声明的变量
}
b();
}
main();

main() 函数创建了本地变量 a 和函数 b()

b()是定义在 main() 内部的内部函数,因此只能在 main() 函数内被访问。 b()没有内部变量,但是由于内部函数可以访问外部函数的变量, b()可以访问 main() 中的变量 a

运行上述代码,我们可以看到 a 的值成功地打印出来。

闭包

概念

比较官方的解释:

一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

第一次看见这个就是一脸懵逼,理解过后可以用一个例子解释一下。

小明穿越了,去到了一个异世界,学习了一些个魔法,然后拯救了异世界,最后回到了地球世界。



异世界的故事虽然结束了,但是小明还会魔法,回到地球后就nb坏了,成为了地球上的大明星。



地球人现在也想学魔法,但是他们没法去异世界学,所以想学魔法只能通过小明。

这里,异世界就是一个函数,里面有魔法、故事、怪兽、知识;

异世界的魔法就是一个局部变量

小明也是一个函数,它会魔法,有知识,经历了这些故事。这时候小明就是一个闭包了。

作用

  • 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
  • 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
  • 虽然相比较直接使用全局变量要复杂,但是更加安全稳定,同时避免污染全局变量环境。

用法

有两种思路

  • 声明一个全局变量,由函数内部元素调用 ( 不推荐,依旧污染全局变量 )
    var y;
function a() {
var x = "xxx";
y = function(){
return x;
}
return x;
}
a();
alert(y());
  • 直接返回一个闭包由外界变量接收
    function a() {
var x = "xxx";
return function () {
return x;
}
}
var b = a();
alert(b());

待续

JavaScript 闭包浅析的更多相关文章

  1. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  2. JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  3. JavaScript闭包(Closure)

    JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...

  4. Javascript闭包和C#匿名函数对比分析

    C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...

  5. javascript闭包理解

    //闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...

  6. Javascript闭包深入解析及实现方法

    1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...

  7. javascript闭包和作用域链

    最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...

  8. JavaScript闭包深入解析

    for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } --上面这段 ...

  9. JavaScript 闭包系列二(匿名函数及函数的闭包)

    一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {     return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...

随机推荐

  1. 使用PropTypes进行类型检查

    原文地址 1.组件特殊属性——propTypes 对Component设置propTypes属性,可以为Component的props属性进行类型检查. import PropTypes from ' ...

  2. python提取图片内容并转换成对应表格的markdown代码

    本节我们将介绍使用python识别一张图片中的内容,并试着得到一张表格,当然并不是类似于Excel的表格,而是该表格的markdown代码. 注:原创内容,转载请标明出处! 相关工具的安装 本次实验环 ...

  3. 如何获取 iOS APP 的 scheme URL ?

    获取IPA文件 拷贝到桌面上 后缀名由 .ipa 改为 .zip 解压之后进入,进入名为Payload的目录 右键点击里面的跟App同名的文件,选择'显示包内容' 用文本编辑器打开当前文件夹下的inf ...

  4. 解决Python3下map函数的显示问题

    今天小编就为大家分享一篇解决Python3下map函数的显示问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.P ...

  5. Java设计模式之Iterator

    public interface Aggregate { //调用iterator方法生成实现Iterator接口的类的实例 public abstract Iterator iterator(); ...

  6. HTML表格概念、语法、操作、案例

    创建两行三列表格 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. 剑指offer-面试题35-复杂链表的复制-链表

    /* 题目: 实现一个函数,复制复杂链表,返回复制链表的头节点. */ /* 思路: 第一步,复制一个链表S‘,插在原链表S中. 第二步,链表S’复制链表S的random指针. 第三步:拆分链表S和S ...

  8. BZOJ #2506. calc [根号分治,莫队,二分]

    \(p\) 是个正常范围, \(\sqrt p <= 100\) 比较小,预处理出来 \(a_i % p == k\) 的位置,然后丢进去,最后询问的 \(p\) 如果大于 \(100\) 就莫 ...

  9. Enable VT-x in your BIOS security settings, ensure that HAXM is installed properly. Try disabling 3rd party security software if the problem still occurs

    win7系统安装了了AndroidStudio3.5后用模拟器报错:Enable VT-x in your BIOS security settings, ensure that HAXM is in ...

  10. 论文阅读笔记(十八)【ITIP2019】:Dynamic Graph Co-Matching for Unsupervised Video-Based Person Re-Identification

    论文阅读笔记(十七)ICCV2017的扩刊(会议论文[传送门]) 改进部分: (1)惩罚函数:原本由两部分组成的惩罚函数,改为只包含 Sequence Cost 函数: (2)对重新权重改进: ① P ...