Javascript闭包与作用域
1.Javascript的作用域是函数作用域而非块级作用域
//C语言
#include
void main()
{int i=2;i--;if(i){int j=3;}printf("%d/n",j); //use an undefined variable:j
}
这是因为c中的作用域是块级的,j是在if后的{ }中定义的,所以无法访问,然而在js中会是什么情况?
(function(){var i=1;if(i==1){var j=3;}console.log(j); //3})()
在这里,j是可以访问的,也就是说在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的
这里提及一句Javascript的作用域链(scope chain),每个函数定义时都会将他的作用域链定设为他定义的环境
function a(){function b(){//code} }
这段代码中,b的环境为a,a的环境为全局(window),在b中查找变量时会先搜索自身函数内部,如果不存在就去a的内部查找,还不存在就去全局中查找,若还是找不到就是undefined,这就构成一条链
2.Javascript中变量的作用域分为全局变量和局部变量
在函数内部可以访问全局变量和函数内的局部变量,而在函数外部访问不到函数内的变量,看代码
var p=11; function f1(){console.log(p); } f1(); //11
function f1(){var p=11; } f1(); console.log(p); //ReferenceError: p is not defined
通过这俩段代码可以理解全局变量和局部变量,但是定义局部变量时一定要注意加上var,如果不加上其实定义的是一个全局变量,看代码
function f1(){p=11; } f1(); console.log(p); //11
3.那如何访问函数内部的变量并对它进行操作呢?这里就需要用到闭包
先看看闭包的官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分
看到这句户我不禁想问,这是个啥?
后来参考了一些博客和《Javascript秘密花园》才开始理解,闭包大概就是函数内部的一个函数被外部调用,这样就可以调用内部变量了,比如下面这段
function f1(){var p=11;return {increment: function() {p++;},show: function() {alert(p)}} } var f=f1(); f.show(); //11 f.increment(); f.show(); //12
先看一下控制台,f是什么样的
这里可以看到,f包含increment和show两个函数,而这两个函数是f1的内部函数所以可以访问p这个变量,在我理解,这里的increment和show就是f1()的两个闭包,用他们就可以从外部调用这个变量
4.闭包可以做些什么?
首先我觉得可以模拟private,就像上面那段代码,这个变量只能在这个函数内部访问,也只有使用了闭包才能访问
第二,和Javascript的垃圾回收有关,这里我还不是很清楚,等到搞明白了再来补上
5.这里有一个要注意的就是循环中使用闭包的问题,这里借用《Javascript秘密花园》里的一个例子
function f1(){for(var i = 0; i < 10; i++) {setTimeout(function() {console.log(i); }, 1000);} } f1();
这段代码输出的是10个10而不是期望的0到9,因为闭包内是对i的引用,然后函数执行时i已经变成了10,这里可以使用自执行的匿名函数
function f1(){for(var i = 0; i < 10; i++) {(function(e) {setTimeout(function() {console.log(e); }, 1000);})(i);} } f1();
这里的匿名函数将i作为参数,这里的e会有i的一个拷贝,而引用时是对e的引用,这就避免了上述的问题
转载于:https://www.cnblogs.com/codingwang/p/3993524.html
Javascript闭包与作用域相关推荐
- JavaScript -- 闭包与作用域链
目录 什么是闭包 作用域及作用域链 闭包的使用及作用 闭包的作用: 闭包不会产生内存泄漏: 闭包的应用: 闭包练习题 参考文章: 什么是闭包 红宝书上解释: 闭包 是指有权访问另外一个函数作用域中的变 ...
- JavaScript中的作用域,闭包和上下文
深入理解JavaScript中的作用域和上下文 很多语言当中都会有作用域的概念,它会给我们带来便利,偶尔也会有烦恼,只有清楚地理解和掌握了它,才能更好地为我所用,今天就带来这么一篇文章供大家参考. 介 ...
- Javascript中闭包的作用域链
作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...
- javascript中关于作用域和闭包
列表项目 前言 学习了javascript已经很久了,关于这个语言中的这两个特性也是早已耳熟能详,但是在实际的使用的过程中或者是遇到相关的问题的时候,还是不能很好的解决. 因此我觉得很有必要深入的学习 ...
- JavaScript 函数(作用域以及闭包)
JavaScript 函数(作用域以及闭包) ・执行环境及作用域 执行环境定义了变量或函数有权访问的其他数据. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量或函数都保存在这个对象中, ...
- javascript(面向对象,作用域,闭包,设计模式等)
javascript(面向对象,作用域,闭包,设计模式等) 1. 常用js类定义的方法有哪些? 参考答案:主要有构造函数原型和对象创建两种方法.原型法是通用老方法,对象创建是ES5推荐使用的方法.目前 ...
- JavaScript函数,作用域以及闭包
JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义. a. 函数的两种定义方式: * functio ...
- 【你不知道的JavaScript上卷】——作用域与闭包
原文: [你不知道的JavaScript上卷]--作用域与闭包 JS语言万变不离其宗,其中最常用.最重要的也就是常用的几个大概念.数据类型.作用域.原型链.闭包.this指针.异步,不同的人理解不一样 ...
- 《JavaScript忍者秘籍》(第二版)- 第5章 -精通函数:闭包和作用域
目录 第5章 精通函数:闭包和作用域 5.1 理解闭包 5.2 使用闭包 5.2.1 封装私有变量 5.2.2 回调函数 5.3 通过执行上下文来跟踪代码 5.4 使用词法环境跟踪变量的作用域 5.4 ...
最新文章
- GPU指令集技术分析
- 谷歌自动驾驶之父疯狂打Call, 无人车连续5小时不接管,又快又稳
- iphone个系列尺寸_iPhone 12尺寸对比:又是真香的典范?
- java虚拟机指令初步学习
- loading怎么关闭 vant_vant-ui组件调用Dialog弹窗异步关闭操作
- YBTOJ:求好元素(哈希表)
- CF1129D Isolation(分块+DP)
- 华硕 x86 android,【华硕X79评测】学不会不收费 几步教你安装Android x86-中关村在线...
- 解码2017双11:全球狂欢新记录背后的阿里云存储
- redis详解- 过期删除策略和内存淘汰策略
- 晨哥真有料丨女生眼中的高级感!
- Leetcode 106.从中序与后序遍历序列重建二叉树
- js获取ie版本号与html设置ie文档模式的方法
- 唯样商城:常见电阻种类
- 取redis中手机验证码,并验证是否正确
- ROS中没有/cmd_vel话题的解决办法
- matlab自带的优化工具箱,MATLAB 自带优化工具箱(optimization Tool)之遗传算法简述...
- 骁龙865与鸿蒙900,天玑2000与骁龙865哪个好_天玑2000与骁龙865对比
- 【论文阅读】Structured Pruning Learns Compact and Accurate Models
- 文件夹固定工具栏_如何将文件夹固定到Windows任务栏