作用域:

var a = 10;
function fun(a){
// var a = 100;
a++;
console.log(a);
}
fun(a);//101
console.log(a);//10
// 作用域(scope):一个变量的可用范围
// 1、全局作用域window:全局变量
// 随处可见,反复使用 ==>全局污染
// 2、函数作用域:局部变量
// 局部变量(AO:Action Object):仅在函数内可用,不可以反复使用
// 函数生命周期:
// 1)开始执行前(生命提前阶段)
// 创建执行环境栈(数组):临时保存正在执行的函数的执行环境
// 向执行环境中添加第一个默认程序main(),该方法创建出一个全局作用域的对象window

// 2)定义函数时
// 创建函数对象,封装函数的定义
// 声明函数变量,引用了函数对象,函数对象的scope属性引用回,创建函数时的作用域
// 3)调用函数时
// 在ECS中加入一个新的元素(执行环境)记录新函数的调用
// 创建一个活动对象,保存本次调用用到的局部变量(函数的参数,在函数体内使用var关键字声明的数据)
// ESC中的新执行环境元素 ,引用活动对象
// 活动对象中的parent属性引用函数的scope指向的父级作用域对象
// 作用:在执行过程中优先使用活动对象中的局部变量,局部中没有,才延着parent向父级作用域找
// 4)调用函数后
// 执行环境栈中本次函数的执行环境出栈
// 导致活动对象被释放,导致局变量一同释放

// 作用域链
// 右多级作用域连续引用形成的链式结果
// 掌握一切变量的使用顺序 :先在局部照,没有则延作用域链向父级作用域中找

闭包:

// 全局变量:可以反复使用,随处可用 -- 全局污染
// 局部变量:不可以重用 ,只在函数中使用
// 闭包:即重用变量,又保护变量不被污染的一种机制
// 取号
// 1、用外层函数包裹受保护的变量和操作变量的内层函数
function outer(){
var i = 1;//活动对象,函数作用域
i = i + 2;//3
// 2、外层函数将内层函数返回
return function getNum(){
console.log(i++);
}
}
// 3、使用者调用外层函数,获得内存函数的对象
var getNum = outer();
//getNum:function getNum(){console.log(i++)}
// 问题:outer()结束后,outer的活的对象释放?
getNum();//1
getNum();//2
getNum();//3

//......
i = 1;//window对象下的变量

getNum();//4
getNum();//5

// 缺点:比一般函数占用更多内存
// 简易的闭包流程图
// 1、先找到受保护的变量,判断外层函数执行后变量的结果
// 2、再找操作变量的内层函数
// 1)被外层函数return到外部
// 2)也可通过直接给全局变量赋值
// 题目:
var nAdd;
function outer1(){
var n = 999;
nAdd = function(){n++};
return function(){console.log(n)}
}

var getN = outer1();
// nAdd();
getN();//999

function fun(){
for(var i = 0,arr= [];i<3;i++){
arr[i] = function (){console.log(i)}
}
return arr;
}
var funs = fun();
funs[0]();//? 3
funs[1]();//? 3
funs[2]();//? 3

转载于:https://www.cnblogs.com/awei313558147/p/11309536.html

2019.8.2闭包,作用域相关推荐

  1. js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象

    js 闭包作用域和作用域链 最近,我们想创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系. 最初,我们只是在领域类中引入依赖关系,但这使得无法在测试中控制其值 ...

  2. java 闭包作用域_Java闭包如何工作

    闭包很像一个对象.只要调用一个函数,它就会被实例化. 在JavaScript中闭包的作用域是词法的,这意味着包含在闭包所属函数中的所有内容都可以访问其中的任何变量. 在闭包中包含一个变量 赋值为var ...

  3. web前端高级JavaScript - 一道题彻底理解函数中this指向和闭包作用域

    关于函数中this指向和闭包作用域的一道练习题 javascript 代码 var x = 3,obj = {x: 5}; obj.fn = (function(){this.x *= ++x;ret ...

  4. 前端工程师地基 深入理解闭包 作用域 立即执行函数

    闭包 一.作用域初探 作用域定义:变量(变量作用于又称上下文)和函数生效(能被访问)的区域 互相嵌套的函数,里面可以访问外面的,外面不能访问里面 外面不访问里面演示: var a = 123; fun ...

  5. 举例详细说明javascript作用域、闭包原理以及性能问题(转)

    转自:http://www.cnblogs.com/mrsunny/archive/2011/11/03/2233978.html 这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存 ...

  6. JavaScript从作用域到闭包

    目录 作用域 全局作用域和局部作用域 块作用域与函数作用域 作用域中的声明提前 作用域链 函数声明与赋值 声明式函数.赋值式函数与匿名函数 代码块 自执行函数 闭包  作用域(scope) 全局作用域 ...

  7. (六)JS基础知识三(走进作用域和闭包)【三座大山之二,不会闭包,基本不会通过】

    JS基础知识三(作用域和闭包) 提问 作用域 自由变量 闭包 this 提问 this的不同应用场景,如何取值 手写bind函数 实际开发中闭包的应用场景,举例说明 创建10个a标签,点击的时候弹出对 ...

  8. JavaScript -- 闭包与作用域链

    目录 什么是闭包 作用域及作用域链 闭包的使用及作用 闭包的作用: 闭包不会产生内存泄漏: 闭包的应用: 闭包练习题 参考文章: 什么是闭包 红宝书上解释: 闭包 是指有权访问另外一个函数作用域中的变 ...

  9. 慕课网前端面试06--js基础-作用域和闭包

    一.题目 this的不同应用场景,如何取值? 手写bind函数? 实际开发中闭包的应用场景,举例说明? 二.知识点 2.1作用域和自由变量 作用域 全局作用域 函数作用域 块级作用域(ES6新增) / ...

最新文章

  1. 强化学习:Policy-based方法Part2
  2. 2013 ACM/ICPC Asia Regional Chengdu Online We Love MOE Girls 字符串STL 的应用
  3. Pycharm同步git代码提示:Merge failed
  4. 蒙特卡罗(Monte Carlo)方法
  5. Github CodeSpaces 使用及定制化
  6. sql server和mysql的区别是什么
  7. ehcache缓存的详细配置
  8. 2016年最酷的十大安全初创公司
  9. 数据库事务复制(读写分离)设计的一点经验
  10. centos开机启动项管理
  11. 审稿较快的2区计算机sci期刊,哪些SCI期刊的审稿速度快
  12. 新建linux用户不能登录用户,Linux下useradd命令创建的用户不能登录的问题
  13. 《现代密码学》学习笔记——第七章 密钥管理[一]
  14. 【数学逻辑思维】好玩的数独游戏(高难度版)——003
  15. 测试开发是什么?为什么现在那么多公司都要招聘测试开发?
  16. 第二类换元法之倒代换习题
  17. 为PDF扫描文件添加书签
  18. 我工作这十年-中国在崛起
  19. Windows重置提示找不到恢复环境
  20. Android打电话不一定要申请权限

热门文章

  1. 网友爆料乘顺风车被司机拿刀砍伤:或面临截肢危险...
  2. 什么是死锁及死锁的必要条件和解决方法【转】
  3. c语言读取excel表格_利用pandas处理excel表格
  4. windows linux复制文件夹命令,ubuntu下复制目录和文件的指令以及和windows下的copy方式...
  5. java xfire指定参数名_XFire绑定Aegis自定义友好参数(复杂对象)
  6. 你不知道的javascript_你不知道的javascript(上)
  7. nodejs实践录:pm2使用
  8. [学习备忘录]Linux平台静态库、动态库的一些笔记
  9. python单行注释用什么符号_Python多行注释和单行注释用法说明
  10. 【Elasticsearch】Elasticsearch中数据是如何存储的