javascript笔记(七)

来源:互联网 发布:阿里云 搬瓦工 cn2 编辑:程序博客网 时间:2024/06/06 08:39
1. ***错误处理
  错误(bug): 程序执行过程中,导致程序异常中断的问题。
  Error: 在错误发生时,保存错误信息的对象
    6种:
    SyntaxError: 语法错误
    ReferenceError: 引用错误,没找到xxx
    TypeError: 类型错误,错误的使用了对象的方法。
    RangeError: 范围错误,特指参数超范围
    EvalError: 错误的使用了eval
    URIError: URI错误
  创建: Error对象是在错误发生时,由js引擎自动创建。
  任何程序在发生错误时,都会强行退出
  错误处理: 在程序发生错误时,保证程序不强行退出的机制。
  如何处理:
    try{
       可能出现错误的代码
    }catch(err){
     只有发生错误时,才执行的错误处理代码
    }finally{
       无论是否出错,都必须执行的代码
    }


  效率: 一段正常代码,只要放入try中,执行效率一定降低。
    1. try中应仅放可能出现问题的代码
    2. 如果可以提前预知的异常处理,都可通过if..else..代替try..catch..
       如果无法提前预知的错误,只能用try catch。
  
  解决浏览器兼容性问题: 
   判断浏览器是否支持Ajax: 
   try{
    new XMLHttpRequest();
    document.write("完美支持Ajax");
   }catch(err){
    document.write("您的浏览器版本太低,不支持Ajax");  
   }


  抛出自定义错误:
   何时: 函数的定义者,向函数的调用者,提醒错误的使用了函数。
   如何: 
    定义者:throw new Error("错误提示")
    调用者:用if...else或try...catch处理异常。


2.*****Function:
 什么是函数对象:封装一个函数定义的对象。
 何时使用: 代码重用
 创建: 3种:
  1.声明: function 函数名(参数列表){
   函数体;
            return 返回值;
          }
    强调:被整体声明提前
  2.函数直接量: 
    var 函数名=function(参数列表){...}
    强调:函数直接量不会被声明提前
    何时使用:只要不希望被声明提前时
    揭示: 函数其实是引用类型的对象
        函数名其实仅是引用函数对象的变量
  3.用new关键词: 
    var 函数名=
     new Function("参数1","参数2",...,

"函数体; return 返回值");


1.*****Function
  重载(overload)
  匿名函数
  作用域和作用域链
*****闭包


1.重载:
  什么是: 相同函数名,不同参数列表的多个函数,在调用时,可自动根据传入的参数不同,调用不同的函数执行。
  为什么: 相同的任务,就应该起相同的函数名,来减轻调用者的负担。
  何时使用: 同一件事,根据传入参数的不同,执行不同的逻辑时。
  如何实现: 
    js的语法不支持重载!
     因为js中不允许同时包含多个同名函数
     最后定义的同名函数,会覆盖之前定义的
    解决: arguments
     arguments:每个函数中,自动创建的,保存所有传入函数的参数值 的 类数组对象
      类数组对象: 长的像数组的对象
       vs 数组: 
         相同: 1. 可用下标访问每个元素
               2. 都有length属性
               3. 使用for 遍历
         不同: 类型不同: 
           数组: Array
           类数组对象: Object
           无法使用数组类型的API
   鄙视题:
   arguments.callee: 引用了当前函数对象
     专门实现递归调用
   arguments.callee.caller: 表示调用当前函数的外层函数。
2. 匿名函数:
  什么是: 定义函数时,不使用任何变量引用的函数。
  为什么: 节约内存
   因为没有任何变量引用,使用完立刻释放
  何时使用: 如果一个函数只用一次。
  如何使用: 
    1. 自调: 创建完函数,立刻执行。
       (function(...){...})()
       执行后,你们函数被释放。
        作用: 1.节约内存
              2.充当临时作用域。避免在全局创建不必要的变量。
    2. 回调: 将函数传给另一个函数去使用
       比如: 比较器函数:
     arr.sort(function(a,b){return a-b});


3. ****作用域和作用域链
  函数的生命周期: 
   1. 程序开始执行:
     创建一个Execution Context Stack(ECS)
       依次保存正在调用的函数的执行环境的栈结构
     创建全局作用域对象:window
     在ECS中压入第一个全局执行环境EC,全局EC引用window
   2. 定义函数时:
      创建函数对象,封装函数的定义
      在函数对象中,设置scope属性,引用函数来自的作用域,通常scope都是window
      用函数名创建全局变量,引用函数对象
   3. 调用函数时:
      创建一个活动对象Actived Object(AO):       活动对象:保存函数的局部变量的函数作用域对象。
      向ECS中压入本次函数调用的执行环境EC
      EC引用AO
      设置AO引用函数的scope(window)
   4. 函数调用后:
      EC出栈,导致AO无人使用,被释放
      导致,AO中的局部变量一同被释放!


   作用域: 一个变量的可用范围
   其实window对象就是全局作用域
       AO对象就是函数作用域
       AO对象又引用了window对象
   作用域链: 由各级作用域对象,逐级引用形成的链式结构,就是作用域链。
     作用域链的末尾是window对象
   作用域链控制着变量的使用顺序: 
     优先使用AO中的局部变量
     如果AO中没有,就延作用域链向下找。
     如果到window还没找到,就报错   


4. *****闭包:
  什么是闭包:即重用变量,又保护变量不受污染的机制。
  为什么使用:
    全局变量: 优: 随处可用,可反复使用
              缺: 易被全局污染
    局部变量: 优: 仅在函数内可用,不会被污染
              缺: 无法反复使用
  何时使用: 如果希望重用一个变量,且不希望该变量被随意篡改时。
  如何实现:3步:
   1. 用外层函数将受保护的变量和操作变量的函数封装在内部
   2. 外层函数将内层函数返回
   3. 调用外层函数,获得返回的内层函数对象。


  说明: 1. 两次外层函数调用返回的闭包中,受保护的变量是各自独立的,没有任何关系。














  

0 0
原创粉丝点击