原型模式故事链(5)--JS变量作用域、作用域链、闭包
上一章 JS执行上下文、变量提升、函数声明 传送门:https://segmentfault.com/a/11...
本次我们主要讲讲变量作用域和闭包
变量作用域:
顾名思义:变量起作用的范围。
变量分为全局变量和局部变量。
全局变量:在任何地方都能用,在所有函数之外。
局部变量:只能在定义它的函数中,以及它的子函数中使用。
当前作用域没有定义的变量,称为自由变量。
举例子:
<!DOCTYPE html>
<html>
<head>
<title>dsfg</title>
</head>
<body>
<script type="text/javascript">
var g = 'globle';
function fn(){
var p = 'part';
console.log(g);//globle
console.log(p);//part
}
fn();
console.log(g);//globle
console.log(p);//报错: p is not defined
</script>
</body>
</html>
在上述例子中,g是全局变量,不存在于任何函数中,能在任何地方使用。
p则是局部变量,只能在fn函数中使用。在外部使用则会报错。
作用域链:
函数的变量在寻找作用域时,不看在哪执行,只看在哪定义。
举例子:
<!DOCTYPE html>
<html>
<head>
<title>dsfg</title>
</head>
<body>
<script type="text/javascript">
var a = 100;
function fn1(){
var b = 200;
function fn2(){
var c = 300;
console.log(a);//100
console.log(b);//200
console.log(c);//300
}
fn2();
}
fn1();
</script>
</body>
</html>
以变量a来解析,上述例子中体现的作用域链。当执行console.log(a)时,先在fn2中寻找变量a,找不到则去到fn2的父级fn1中寻找,也找不到。再到fn1的父级中寻找,也就是全局变量中寻找,终于找到了。像这样一层一层向上查找,就叫变量作用域链。
如果在其中任何一层找到了,则不会继续向上查找。
闭包:
下个定义:可以访问另一个函数作用域变量的函数。所以闭包其实是个函数。
为什么要用闭包呢?
局部变量无法共享和长久的保存,全局变量则很容易造成变量污染。闭包则能长久保存变量,又不会污染。
闭包特点:占用更多内存,不容易被释放。
闭包使用场景:1.函数作为返回值(retrun 一个函数)
2.函数作为参数传递到另一个函数中。
举例子:
<!DOCTYPE html>
<html>
<head>
<title>lalala</title>
</head>
<body>
<script type="text/javascript">
function fn(){
var a = 100;
return function(){
console.log(a);
}
}
var f1 = fn();
var a = 200;
f1();//100
</script>
</body>
</html>
1.定义外层函数,封装被保护的局部变量。
2.定义内层函数,执行对外部函数的变量操作。
3.外层函数返回内层函数的对象,且外层函数被调用时,结果保存在一个全局变量中。
执行f1()时,a在当前函数中未定义,往父级查找fn中a=100,所以a=100;
(函数变量作用域不看在哪执行,只看在哪定义)
好啦好啦,jS三座大山翻过两座了,还剩一个异步,单线程~
原型模式故事链(5)--JS变量作用域、作用域链、闭包的更多相关文章
- 原型模式故事链(4)--JS执行上下文、变量提升、函数声明
上一章:JS的数据类型 传送门:https://segmentfault.com/a/11... 好!话不多少,我们就开始吧.对变量提升和函数声明的理解,能让你更清楚容易的理解,为什么你的程序报错了~ ...
- 原型模式故事链(3)--JS的数据类型、以及区别、区分、转化
上一章--原型链讲解:传送门:https://segmentfault.com/a/11... 在上一章讲解原型链时提到了:所有的引用类型都有一个_proto_属性,称之为隐式原型.那么引用类型是什么 ...
- js变量及其作用域(附例子及讲解)
Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量 工具/原料 Ch ...
- 详解js变量、作用域及内存
详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和Strin ...
- JS变量、作用域、内存
写到这个题目<JS变量.作用域,内存>,我就不由自主想起了黄金三嫖客.可能是名字有点像,嗯,一定是这样子的! JS接触下来,应该是要比Java简单不少的,所以,要学好啊.立个flag半年后 ...
- js课程 1-4 js变量的作用域是怎样的
js课程 1-4 js变量的作用域是怎样的 一.总结 一句话总结:只有在函数内部前面带var的变量为局部变量,局部变量只能在函数体内使用. 1.什么情况下会出现NaN类型的错误,举一例? Num ...
- js变量及其作用域
Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量 一.js变量的类型及 ...
- Js 变量的作用域
变量的作用域 所有的变量作用域是指在哪里可用哪里不可用 局部作用域和全局作用域 在js中以函数来分割作用域 在函数里面就叫做局部作用域,在函数外面的就叫全局作用域 在函数里面如果省略var 关键字 那 ...
- JS变量的作用域
深入理解JavaScript变量的作用域 1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在 ...
随机推荐
- Python爬虫学习==>第十章:使用Requests+正则表达式爬取猫眼电影
学习目的: 通过一个一个简单的爬虫应用,初窥门径. 正式步骤 Step1:流程框架 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: 正则表达式分析:根据html ...
- Django下orm学习 一对多
概念说明 ORM:关系对象映射的全称是 Object Relational Mapping, 简称ORM SQLAlchemy: 是Python编程语言下的一款ORM框架,该框架建立在数据库API之上 ...
- FTP简单搭建(一)
一.FTP服务介绍 vsftp(very security ftp file transfer protocol 非常文件传输协议) FTP分为主动模式和被动模式. 主动模式:(不安全,传数据的端口是 ...
- 服务器iptables规则记录
很多时候,我在我自己的VPS上面部署了Cobalt Strike,可是网上很多叼毛就会扫描我们的VPS,然后发现我们的Cobalt Strike,如果你还建有web delivery,还会被人家下载上 ...
- [c++] 幂法求特征向量
幂法的原理可参考此篇论文:http://d.wanfangdata.com.cn/Periodical/hnnydxxb2001Z1023 本文求解的是 3 阶矩阵最大特征值及其特征向量 下面是其 C ...
- [转帖]glib gslibc libc 的关系与区别
https://blog.csdn.net/Com_ma/article/details/78692092 [glibc 和 libc] glibc 和 libc 都是 Linux 下的 C 函数库. ...
- 有人向你扔了一个bug,哈哈哈哈
有人向你扔了一个bug. "26楼会议室的灯亮着.它应该是熄灭着的." bug的备注里写道"你应该能在5分钟内搞定,只要按一下开关就好了."你去了26楼的会议室 ...
- Zabbix 配置钉钉脚本告警
1.钉钉账号创建,并创建一个组,在组中添加一个机器人,然后记下webhook地址即可. 2.编辑一个报警脚本,此处使用的是BASH脚本,并覆盖我们的webhook地址到相应的位置. [root@loc ...
- c# 简单打开关闭摄像头
const short WM_CAP = 1024; const int WM_CAP_DRIVER_CONNECT = WM_CAP + 10; const int WM_CAP_DRIVER_DI ...
- 18 Python之初识面向对象
1. 类与对象 class Car: #类名首字母大写,严格遵守驼峰命名规范 pass #造车 c = Car() #类名() #创建对象 ##出场之后进行改装 c.color = "红色& ...