函数作用域

函数有个隐藏的属性[[scope]],这个属性就是作用域,其存储了运行期上下文的集合。

[[scope]]存储运行期上下文集合,这些集合呈链式关系,就是作用域链。

[[scope]]属性结构

第一个元素 >>> 当前运行函数的 ActivationObject

第二个元素 >>> 当前运行函数父函数的 ActivationObject

第三个元素 >>> 当前运行函数父函数的父函数的 ActivationObject

…………

最后元素 >>>  GlobalObject

<script type = "text/javascript">function a(){function b(){function c(){function d(){}d();}c();}b();}function e(){}// a 和 e 函数定义时它们的 [[scope]] 属性中只有一个元素,就是 GlobalObject(全局运行时上下文)//当要执行 a 函数时,a 函数就创建自己的 ActivatonObject(运行时上下文),存储在属性[[scope]]中,并放置到顶端(第1个元素)//这时 a 函数的[[scope]]属性的内容是//第一个元素   ActivationObject(a的运行时上下文)//第二个元素   GlobalObject(全局的运行时上下文)a();//当执行 a 函数时,b 函数运行前,b函数属性[[scope]]引用了函数 a 的[[scope]]属性,并且b函数创建自己的 ActivationObject。//这时 b 函数的[[scope]]属性的内容是//第一个元素   ActivationObject(b的运行时上下文)//第二个元素   ActivationObject(a的运行时上下文)//第三个元素   GlobalObject(全局的运行时上下文)//当 b 函数执行时,查找变量的顺序是[[scope]]属性,从上往下查找。直到找到第一个符合的停止。//当 b 函数执行完后,销毁自己创建ActivationObject//这时 b 函数的[[scope]]属性的内容变为//第一个元素   ActivationObject(a的运行时上下文)//第二个元素   GlobalObject(全局的运行时上下文)//当执行 b 函数时,c 函数运行前,c函数属性[[scope]]引用函数 b 的[[scope]]属性,并且c函数创建自己的 ActivationObject。//以此类推,直到所有函数执行完毕。
</script>

闭包:

内部函数被返回到外部时,内部函数本身存着父函数的ActivationObject,即使父函数执行完,取消了对 ActivationObject引用,但内部函数依然可以存取父函数变量。这样就产生闭包。闭包会导致原有作用域链不释放,造成内存泄漏。

闭包的作用:实现公有变量(累加器)、缓存(存储结构)、实现封装,属性私有化、模块化开发,防止污染全局变量。

<script type = "text/javascript">function a(){var num = 0;function b(){num ++;document.write("num = ",num,"<br/>")}return b;}var demo = a();demo();//1demo();//2demo();//3
</script>

闭包应用:缓存

<script type = "text/javascript">function eater(){var food = [];var obj = {eat:function(){if(food.length < 1){document.write("There is no food!<br/>");}else{document.write("i am eating " + food[food.length - 1],"<br/>");food.pop();}},push:function(myFood){food.push(myFood);}}return obj;}var eater1 = eater();eater1.push("apple");eater1.push("banana");eater1.eat();eater1.push("orange");eater1.eat();eater1.push("cake");eater1.eat();eater1.eat();eater1.push("banana");eater1.eat();eater1.eat();
</script>

立即执行函数(初始化功能的函数)

应用在只执行一次的函数。只有函数表达式才能被执行符号()执行,函数声明不能被执行。

<script type = "text/javascript">(function(){document.write("ohohoh!!","<br/>")}());//W3C推荐立即执行函数格式(function(){document.write("ohohoh!!","<br/>")})();var x =(function(a,b,c){return a + b + c;}(1,2,3))document.write(x,"<br/>");var y = function demo(){document.write("hahaha!!!","<br/>")}();//function error(){document.write("ohohoh!!","<br/>");}();函数声明不能被执行+function error(){document.write("ohohoh!!","<br/>");}();
</script>

立即执行函数与闭包应用

<script type = "text/javascript">//立即执行函数,闭包保存循环变量 ii 的使用方式。function test(){var arr = [];for (var i = 0; i < 10; i++) {(function(ii){arr[ii] = function(){document.write("i = " + i + " ii = " + ii + "<br/>")}    }(i))}return arr;}var myArr = test();for(var j = 0;j < myArr.length;j++){myArr[j]();}
</script>

渡一教育公开课web前端开发JavaScript精英课学习笔记(六)函数及作用域相关推荐

  1. 渡一教育公开课web前端开发JavaScript精英课学习笔记(一)前言

    Mosaic浏览器     NCSA Mosaic,或简称Mosaic(马赛克),是互联网历史上第一个获普遍使用和能够显示图片的网页浏览器,它是由伊利诺伊大学厄巴纳-香槟分校的NCSA组织在1993年 ...

  2. 渡一教育公开课web前端开发JavaScript精英课学习笔记(二十九)JavaScript 骇客帝国

    JavaScript 骇客帝国 <!DOCTYPE html> <html><head><meta charset="UTF-8"> ...

  3. 渡一教育公开课web前端开发JavaScript精英课学习笔记(二)变量类型,运算符

    JavaScript引入方式 内嵌 <script type = "text/javascript">document.write('hello,javascript! ...

  4. 渡一教育公开课web前端开发JavaScript精英课学习笔记(二十六)JavaScript 打砖块

    打砖块 <!DOCTYPE html> <html><head><meta charset="UTF-8"><meta nam ...

  5. 渡一教育公开课web前端开发JavaScript精英课学习笔记(十)数组的常用方法

    数组的常用方法(ES3) 以ES3.0为基础,ES5.0 在ES3基础上扩展,ES6.0 在ES5基础上扩展. 改变原数组的方法: push.pop.shift.unshift.sort.revers ...

  6. 渡一教育公开课web前端开发JavaScript精英课学习笔记(三)条件语句,循环语句

    if 条件判断语句 if(条件){ 如果条件为真时,执行的代码. } else { 如果条件为假时,执行的代码. } <script type = "text/javascript&q ...

  7. 渡一教育公开课web前端开发JavaScript精英课学习笔记(三十二)JavaScript旋转方块

    JavaScript旋转方块 <!DOCTYPE html> <html lang="en"><head><meta charset=&q ...

  8. 渡一教育公开课web前端开发JavaScript精英课学习笔记(七)对象和包装类

    Js对象有三种 内置对象:ECMAScript 规定的对象,如:Math String Number Boolean Function Object... 宿主对象:Js运行环境中的对象,如DOM文档 ...

  9. 渡一教育公开课web前端开发JavaScript精英课学习笔记(二十一)CSS3实现Loading

    CSS3实现Loading <!DOCTYPE html> <html> <head><meta charset="UTF-8">& ...

最新文章

  1. 创业公司自曝「被谷歌封杀」,阻断一切访问,上诉只得到机器人回复
  2. 周杰伦300多万NFT被黑客盗走,上链加密艺术就这??
  3. C#路径/文件/目录/I/O常见操作汇总(一)
  4. SAP MM 评估类型 评估类别
  5. 行业研究报告基本分析思路updated with 5c model
  6. python 正则表达式语法大全_Python 之父撰文回忆:为什么要创造 pgen 解析器?
  7. 1、RN跨平台开发——环境搭建
  8. java收发邮寄_JavaMail收发邮件的一般流程与主要方法
  9. mysql 判断是数据类型_mysql数据类型判断
  10. Emacs自带小游戏
  11. matplotlib -plt.rcparams.update
  12. ios- uitextview的详细使用方法
  13. 通讯录c语言链表实验报告,通讯录管理系统数据结构C语言版链表实现实验报告(31页)-原创力文档...
  14. 芯片之路: 海思半导体前世今生
  15. linux 修改网卡mac地址,Ubuntu 更改mac地址
  16. java面向对象怎样建类和对象_java面向对象(上)-- 类与对象、类的封装
  17. Android耗电统计算法
  18. linux键盘控制鼠标软件下载,手机控制电脑软件(Mouse Server)
  19. 配置虚拟机(VMware Workstation)静态 IP 地址
  20. CPU Cycle(CPU 周期)、Instruction Cycle(指令周期)、Clock Cycle(时钟周期)

热门文章

  1. 曲线拟合问题与L2正则
  2. 11、分布式爬虫(一)
  3. 高通Android智能平台环境搭建_编译流程分析
  4. 一文读懂Redis的四种模式,单机、主从、哨兵、集群(*)
  5. 数控是用计算机来计算的吗,数控机床的完美控制—帮助页面和计算器
  6. 基于BS的传统中医诊断系统软件开发与实现
  7. 一个最简单的C#管道(NamePipe)全双工通信实例
  8. Python字典(Dictionary)操作全解【创建、读取、修改、添加、删除、有序字典、浅复制、排序】
  9. IHE在中国应用的研究
  10. 西屋除湿机:快速干衣除了烘干机你还有更棒的选择