概念:闭包就是能够读取其他函数内部变量的函数。

作用:一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

闭包注意问题:

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

作用域链

概念:在一个函数中嵌套多个函数,并且各自定义的相同的变量名,当函数访问变量时,就形成了作用域链。

查找顺序:从当前函数开始查找,如果没有找到,向上一级函数开始查找,直到找到为止,如果一直没有找到,则说明该变量未定义。

作用域链明确表示:在变量解析过程中首先查找局部作用域,然后查找上层作用域。

垃圾回收

有两种策略来实现垃圾回收:

标记清除 和 引用计数

标记清除:垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量的标记和被环境中的变量引用的变量的标记,此后,如果变量再被标记则表示此变量准备被删除。 2008年为止,IE,Firefox,opera,chrome,Safari的javascript都用使用了该方式;

引用计数:跟踪记录每个值被引用的次数,当声明一个变量并将一个引用类型的值赋给该变量时,这个值的引用次数就是1,如果这个值再被赋值给另一个变量,则引用次数加1。相反,如果一个变量脱离了该值的引用,则该值引用次数减1,当次数为0时,就会等待垃圾收集器的回收。

函数嵌套

一个函数定义的内部可以定义其他的函数。

函数自执行

(function (argument1,argument2){

  这里是要执行的代码

})();

将函数声明用()括起来,相当于一个函数表达式。

创建\调用函数注意问题

如果两个函数的命名相同,后面的将会覆盖前面的函数。 以基本语法声明的函数,会在页面载入的时候提前解析到内存中,以便调用。所以可以在函数的前面调用。但是以字面量形式命名的函数,会在执行到他的时候,才进行赋值。所以只能在函数的后面调用。

在不同的<script></script>块中,因为浏览器解析的时候是分块解析的,所以前面的块不能调用后面块的函数,所以在不同的块之间调用函数的时候,应该先定义后调用。

带有参数的函数

参数的作用:

可以动态的改变函数体内对应的变量的值,使同一函数体得到不同的结果。

形参:在定义函数的时候,函数括号中定义的变量叫做形参。用来接受实参的。

实参:调用函数的时候,在括号中传入的变量或值叫做实参。用于传递给形参。

参数详解

参数的类型

  – 可以是任何的数据类型。

参数的个数

  – 实参和形参数量相等,一一对应。

  – 实参小于形参,不会报错,多出形参的值会自动赋值为undefined。

  – 实参大于形参,不会报错,但如果要获得多出实参的值,需要用arguments对象来获取。

arguments对象详解

每创建一个函数,该函数就会隐式创建一个arguments对象,他包含有实际传入参数的信息。

arguments对象的属性

 length 获得实参的个数

– callee 获得函数本身的引用

– 访问传入参数的具体的值。arguments[下标]

Var a =100function test() {    alert(a);    a = 10;    alert(a);    }    test();    alert(a);    阅读以上代码,结果应为多少?

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title></title></head><body><script>//概念:闭包就是能够读取其他函数内部变量的函数。//闭包可以让局部变量持久化//作用:一个是前面提到的可以读取函数内部的变量,//另一个就是让这些变量的值始终保持在内存中//【注意】1、在退出函数之前,将不使用的局部变量全部删除//2、闭包会在父函数外部,改变父函数内部变量的值。//3、不要随便改变父函数内部变量的值//4、函数在调用时会开辟新空间,这块内存空间在函数执行完毕时释放//createComparisonFunction() 作用域function createComparisonFunction(propertyName){return function(object1,object2){//内部函数 访问了propertyNamevar value1 = object1(propertyName);var value2 = object2(propertyName);if(value1 < value2){return -1;}else if(value1 > value2){return 1;}else{return 0;}};}function compare(value1,value2){if(value1 < value2){return -1;}else if(value1 > value2){return 1;}else{return 0;}}var result = compare(5,10);</script></body>
</html>

用闭包打印li的下标

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><ul><li>蜡笔小新</li><li>野原葵</li><li>野原美伢</li><li>野原广志</li></ul><script>
//            var li = document.getElementsByClassName("li");
//            for(var i = 0;i<li.length;i ++){
//                function dianji(){
//                    var j = i;
//                    function a(){
//                        alert("下标为"+j);
//                    }
//                    return a;
//                }
//                li[i].onclick = dianji()
//            }//第二种方法var li = document.getElementsByTagName("li");for(var i = 0;i<li.length;i ++){li[i].onclick = function(num){return function(){alert(num);}}(i);//执行匿名函数}</script></body>
</html>

转载于:https://www.cnblogs.com/jinguanzhang/p/7078084.html

闭包、作用域链、函数相关推荐

  1. python之路day10-命名空间和作用域、函数嵌套,作用域链、闭包

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y):m = x if x>y else yreturn mbigger = my_max(10,20)print(b ...

  2. JavaScript:从内存的角度图解 函数作用域及作用域链

    一.作用域 (scope):一个变量的使用范围 (1)全局作用域:既是指全局变量,其特点是可反复使用,缺点是使用不当极易造成全局污染. (2)函数作用域:既是指局部变量,其特点是只在函数体内部有效,函 ...

  3. js作用域链以及全局变量和局部变量

    > [带var] > 在当前作用于中声明了一个变量,如果当前是全局作用域,也相当于给全局作用域设置了一个属性叫做a ```javascript //=>变量提升:var a; < ...

  4. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(上)

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  5. 什么是作用域、作用域链

    什么是作用域 作用域作用:一个变量的可用范围 本质:其实作用域是内存中保存变量的对象 为什么使用作用域:防止不同范围之间的变量互相污染. 全局作用域:专门保存全局变量的区域/存储空间 什么是全局变量: ...

  6. js的作用域链,原型链,以及闭包函数理解

    代码一: this.number = 10 function a() {this.number = 20 } a.prototype.init = () => console.log(this. ...

  7. 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例

    函数作为返回值练习 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  8. 三、函数的嵌套、作用域链、函数名的应用、闭包。

    一.函数的嵌套 1.1函数的嵌套调用 def max2(x,y):m = x if x>y else yreturn mdef max4(a,b,c,d):res1 = max2(a,b)res ...

  9. Javascript读书笔记(六)函数作用域,声明提前,作用域链,闭包

    参照内容来自<JavaScript权威指南>,<JavaScript高级程序设计> 函数作用域 类似C语言的编程语言中有块级作用域,JavaScript中没有块级作用域,取而代 ...

  10. JavaScript高级第2天:定义函数的三种方式、函数的原型链结构、完整原型链、作用域以及作用域链、函数的四种调用模式、闭包、计数器、斐波那契数列优化、三种继承方式

    JavaScript高级第二天 01-定义函数的三种方式 1.函数声明 function:可以先调用再声明,因为预解析(把函数声明.变量声明进行提升) function fn() {//函数体conl ...

最新文章

  1. Linux查看多核CPU利用率
  2. sql按相似度模糊查询实例
  3. c++ 将输入存储到数组,然后反转数组,最后输出
  4. springboot4.1.1的log4j2配置
  5. 系统服务描述表指针查找
  6. LiveRTMP 之RTMP直播高效推送缓冲区
  7. 数据库查询新增一列默认值
  8. VTK:参数样条用法实战
  9. 多线程基础:两种常见的创建线程的方式
  10. 一般php的入口在哪,PHP单入口是否是必须的
  11. php生成字母数字订单,php生成唯一订单号可控制位数字母和数字
  12. Servlet Cookie 处理
  13. stm32PWM输入捕获模式详解
  14. springboot+vue+easychart报表导出前后台
  15. m7405d粉盒清零方法_打印机清零方法总览
  16. 宇宙机器人超级计算机,宇宙机器人无线控制器使用指南白金攻略[多图]
  17. 工欲善其事必先利其器 突然的感悟
  18. 速度来看mac电脑怎么彻底关闭系统更新
  19. 【QScrollBar | QSlider | QDial | QProgressBar | QLCDNumber】
  20. 层次分析法——确定指标权重、解决评价类问题

热门文章

  1. 数字字符减去数字字符0就是数字
  2. 操作系统——基本概念·
  3. 阶段3 3.SpringMVC·_05.文件上传_3 文件上传之Springmvc方式上传原理分析
  4. Python爬虫面试题170道:2019版【1】
  5. [Noi2015]寿司晚宴
  6. UVa 1399 Puzzle
  7. 《受欢迎的奶牛》和强连通分支Tarjan算法
  8. IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
  9. Async.js——Node世界中被依赖最多的库No.3
  10. gsoap使用心得![转]