JavaScript高级程序设计:第七章 - 函数

六、函数表达式

  //把函数当成值来使用的情况下,都可以使用匿名函数
  1. 递归

    //递归函数是在一个函数通过名字调用自身的情况下构成的
    //使用函数声明来定义递归函数可能会出现问题
    //这是一个经典的递归阶乘函数
    
    function factorial(num) {
      if (num<1){
        return 1;
      }else{
        return num * factorial(num-1);
      }
    }
    //使用函数声名来定义该递归函数时,函数名和函数体会产生耦合。
    //当其他指针指向该函数体的时候,由于执行anotherFac()必须执行factorial,而factorial变量已经设为null,就会导致错误
    var anotherFac = factorial;
    factorial = null;
    anotherFac(5);
    //可以用arguments.callee来解决该问题,不在赘述
    //也可以将命名函数表达式赋值给变量factorial,这种解决办法在严格模式下依然有效
  2. 闭包

    闭包是指有权访问另一个函数作用域中的变量的函数(最常见的表现形式是从一个函数中返回另一个函数),容易和匿名函数搞混。在函数被调用时,会创建一个执行环境及相应的作用域链。由该函数的arguments和其他命名参数的值初始化的活动对象排在作用域链的第一位,外部函数的活动对象则始终处于第二位,而最外层则是全局变量对象。一般情况下当函数执行完毕后,拒不活动对象就会被销毁,内存中仅保存全局变量对象,但是闭包的情况由有所不同。闭包会携带包含它的函数作用域,比其他函数占用更多内存。所以要慎用闭包。凡是匿名函数的this都是指向window。Javascript没有块级作用域的概念,所以在语句块中定义的活动变量的范围会扩大到整个函数体。可以用匿名函数(function(){})()来避免这种情况。解释(function(){})()的问题在185页。私有变量能够帮助理解为什么对象的构造函数长那个样子。初始化未经声明的变量,总是会创建一个全局变量。(这也是函数声明和函数表达式的不同之处,函数声明只能创建局部函数
时间: 2025-01-02 10:08:01

JavaScript高级程序设计:第七章 - 函数的相关文章

读书笔记 - js高级程序设计 - 第七章 函数表达式

闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者只在绝对必要时再考虑使用闭包 模块模式   增强的模块模式   特权方法 有权访问私有变量的公有方法叫做特权方法 块级作用域   实现单例的特权方法  

javaScript高级程序设计--第7章函数表达式

1.定义函数的方式有两种: a.函数声明: getName(); function getName(){ alert("123")}; 函数声明的特征:函数声明的提升,所以上面的例子才可以在函数声明前调用函数而不报错 b.函数表达式(又叫匿名函数,注意不能在表达式完成前调用,会报错) var getName = function(){alert("123")}; getName(); 2.递归 arguments.callee  指向一个正在执行的函数的指针,所以实

javascript高级程序设计 第十三章--事件

javascript高级程序设计 第十三章--事件js与HTML的交互就是通过事件实现的,事件就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流:事件流描述的是从页面中接收事件的顺序,IE的是事件冒泡流,Netscape的是事件捕获流,这个两个是完全相反的事件流概念. 事件冒泡:由最具体的元素接收,然后逐级向上传播到更高级的节点,即事件沿DOM树向上传播,直到document对象. 事件捕获:不大具体的节点应该更早接收到事件,相当于沿DOM节点树向下级传播直到事件的实际目标,在浏览器中,是

Javascript高级程序设计——第三章:基本概念

javascript高级程序设计——第三章:基本概念 一.语法 EMCA-262通过叫做ECMAScript的“伪语言”为我们描述了javascript实现的基本概念 javascript借鉴了C的语法,区分大小写,标示符以字母.下划线.或美元符号($)开头,注释可以用 // 或者/* */ 严格模式: ECMAScript 5引入了严格模式,在严格模式下不确定的行为将得到处理,通过在顶部添加 “use strict”来启用严格模式: function fuc(){ "use strict&qu

javascript高级程序设计 第十一章--DOM扩展

javascript高级程序设计 第十一章--DOM扩展DOM最主要的扩展就是选择符API.HTML5和Element Traversal Selectors API:定义了两个方法 querySelector() 和 querySelectorAll(),能够基于CSS选择符从DOM中取得元素.querySelector()方法接收一个CSS选择符,返回该模式匹配的第一个元素,querySelectorAll()接收的参数一样,但是返回NodeList实例: matchesSelector()

《JavaScript高级程序设计第五章--引用类型》之Object对象和array对象

这一章主要就是介绍各种内置对象的用法,认识其经常用到的属性和方法. 5.1Object类型 创建objec的方式,一种是new Object(),一种是对象字面量(简化创建包含大量属性的对象的过程) var person = { name = "Nicholas"; age = 27 };//最后一个属性不必添加逗号,ie7等会导致错误 //在使用对象字面量语法时,属性名也可以使用字符串.这里的数值属性会自动转字符串. var person = { "name" :

Javascript高级程序设计——第三章:函数

函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionName(arguments){ statement; } 函数会在执行return语句后停止并退出.return语句之后的任何代码不会被执行. function say(){ return “hay”; alert("hay"); //永远不执行 } return后不带返回值的会返回unde

《JavaScript》高级程序设计第7章 函数表达式

7.2 闭包 定义: 闭包是指有权访问另一个函数作用域中的变量的函数. 理解闭包: 作用域链: 当某个函数被调用时,会创建一个执行环境以及相应的作用域链. 作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位.....直至作为作用域链终点的全局执行环境 变量对象: 全局函数的变量对象始终存在, 而局部环境的变量对象只在函数执行的过程中存在. 一般来讲, 当函数执行完毕后, 局部活动对象就会被销毁, 内存中仅保存全局作用域(全局执行环境中的变量对象)但是闭包的情况又

javascript高级程序设计 1 ~ 3 章 部分知识点总结

第一章 javascript简介 javascript的简介,有关js的一些历史问题. js初期在不同的浏览器存在很大的兼容问题,但是慢慢的大家都在向标准靠拢,兼容问题已经好很多了. 我们通常会听到ECMAScript,它跟javascript是什么关系呢? JS = ES + BOM(浏览器对象模型) + DOM(文档对象模型)  ES就是对javascript的类型,值,对象,属性,函数以及程序句法和语义,DOM就是ES运行在浏览器环境的时候,浏览器为其提供的扩展以实现更多更具体的功能(we

JavaScript高级程序设计第20章JSON 笔记 (学习笔记)

第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5  表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”age”:24}与JavaScript对象有两处不同一是没有声明变量 二是没有末尾的分号json对象中属性必须带引号,对象里的值可以嵌套对象. 3.数组 Json数组表示:[25,”hi”,true]和json对象一样json里也没有分号和变量 2.json对象 1.Stringify()方法用于把ja