JavaScript 闭包浅析
词法作用域
词法作用域是指一个变量在源码中声明的位置作为它的作用域。
同时嵌套的函数可以访问到其外层作用域中声明的变量。
函数中的定义的局部变量只能由函数的内部成员访问,而函数中的內部成员可以访问外部元素。
例:
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 闭包浅析的更多相关文章
- 《Web 前端面试指南》1、JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- JavaScript闭包(Closure)
JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...
- Javascript闭包和C#匿名函数对比分析
C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...
- javascript闭包理解
//闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...
- Javascript闭包深入解析及实现方法
1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点:1. 作为一个函数变量的一个引用,当函数返回时 ...
- javascript闭包和作用域链
最近在学习前端知识,看到javascript闭包这里总是云里雾里.于是翻阅了好多资料记录下来本人对闭包的理解. 首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法: 外部函数 ...
- JavaScript闭包深入解析
for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } --上面这段 ...
- JavaScript 闭包系列二(匿名函数及函数的闭包)
一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) { return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...
随机推荐
- mysql 主主备份
1.1.主主备份原理. 主主备份实际上是互为主从,主要是为了去缓解写入压力. 1.2.环境准备 两台机器ip分别为 100.100.100.105 (主1) 100.100.100.106(主2) 安 ...
- Windows2008R2 一键安全优化脚本
::author vim ::QQ 82996821 ::filename Windows2008R2_safe_auto_set.bat :start @echo off color 0a ...
- PMP--1. PMBOK框架部分目录
1.1 PMBOK体系框架描述https://www.cnblogs.com/hemukg/p/11821210.html 1.2 PMBOK指南组成部分https://www.cnblogs.com ...
- POJ 3253 Fence Repair 贪心 优先级队列
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 77001 Accepted: 25185 De ...
- WPF 控件功能重写(ComboBox回车搜索)
前言:在我们日常使用软件的时候,Combobox会让用户很方便的选择出需要的东西,但是ComboBox中的下拉行数过多时就不那么好用了. 如果在项目中有很多这样的ComboBox控件的话,我们可以考虑 ...
- opencv —— 同时识别三种颜色
要点: 1.识别一种颜色 minH = ; //色相 maxH = ; minS = ; //饱和度 maxS = ; minV = ; // inRange(原图像, 最小值的范围, 最大值的范围, ...
- 【笔记】机器学习 - 李宏毅 - 7 - Deep Learning
深度学习发展历史: 感知机和逻辑回归很像,只是没有\(sigmoid\)激活函数. 深度学习训练的三个步骤: Step1:神经网络(Neural network) Step2:模型评估(Goodnes ...
- 使用这7个隐藏技巧让您的Mac更易于阅读和使用!
macOS Mojave(10.15)可以说是苹果公司功能最强大,功能最强大的现代Mac软件更新版.它带来了一系列新功能,安全和隐私控制,稳定性增强以及Dark Mode主题! 它也代表了最易于使用的 ...
- pygame 运行心理学问卷
import pygame import sys from pygame.locals import * # wait for keys to putdown def waitForKeys(keys ...
- idea中如何配置git以及在idea中初始化git,并push到码云
一.给idea配置git 打开IDEA,按照路径 Fie-->Settings --> Tools -->Terminal 找到后设置右边的Shell path(自己安装的Git路 ...