JS基础第九天:逆名函数以及作用域的介绍
2017-05-31 13:39
337 查看
宁徽说事 2017-05-28 06:01
1. Date:
什么是: 封装一个日期,提供对日期执行操作的API
何时: 今后只要保存或操作日期都用Date对象
如何:
创建: 4种:
1. 获得客户端当前系统时间:
var now=new Date();
2. 创建日期对象保存自定义时间:
var date=new Date("yyyy/MM/dd hh:mm:ss")
new Date(yyyy,MM-1,dd,hh,mm,ss)
3. 复制一个日期:
为什么: 日期的计算都直接修改原日期对象
旧时间无法保存
何时: 如果需要同时保存计算前后的两个时间时,就必须将原日期复制一个副本再计算。
如何: var date2=new Date(date1);
4. 直接用毫秒数创建日期对象:
var date=new Date(ms)
原理: Date对象中保存的是1970年1月1日0点至今的毫秒数
API:
单位:年FullYear月Month日Date星期Day
时Hours分Minutes秒Seconds毫秒MilliSeconds
1. 每个单位都有一对儿getXXX/setXXX方法
getXXX()方法负责读取指定分量的值:
比如: date.getDate(); //获得几号
setXXX(n) 方法负责修改指定分量的值:
比如: date.setDate(10); //修改date的日期为10号
特例: Day没有set方法,因为星期只读,不可改
2. 取值范围:
只有月中的日(Date)从1开始到31结束
其余单位都是从0开始,到进制-1结束
Month 0~11 比现实中都小1 需要修正
Date 1~31
Day 0~6 星期日是0,不需要修正
Hours 0~23 不用修正
Minutes,Seconds 0~59 不用修正
日期计算:
1. 两日期相减: 获得毫秒差
2. 对任意单位做加减: 3步:
1. 取分量: var n=date.getXXX();
2. 做加减: n+=?;
3. 放回去; date.setXXX(n);
特点: 1. 自动调整进制
2. 直接修改原日期对象
简化版: date.setXXX(date.getXXX()+n)
转字符串:
.toString() --> 转为中国标准时间(+8区)
.toLocaleString() --> 转为系统当前时间格式
.toLocaleDateString --> 转为系统当前时间格式
仅包含日期部分
.toLocaleTimeString --> 转为系统当前时间格式
仅包含时间部分
.toGMTString() --> 转为国际标准时间(0时区)
1. ***Error:
错误: 在程序执行过程中,导致程序异常中断的特殊情况
错误处理: 在程序执行过程中,即使程序出错,也能保证不会异常中断的机制。
如何:
try{
可能出现错误的语句
}catch(err){//err: 自动获得错误对象——不可省略
一旦出错,才执行的错误处理代码: 提示错误, 记录日志
}finally{
无论是否出错,都必须执行的代码: 释放资源
}
Error: 封装错误信息的对象
在发生错误时,自动创建
err.name: 错误的名称
err.message: 错误的提示信息
js中包含6种错误:
SyntaxError: 语法错误
ReferenceError: 引用错误 要用的东西没找到
RangeError: 范围错误 专指参数超范围
TypeError: 类型错误 错误的调用了对象的方法
EvalError, URIError
原则: 1. try中尽量少的包含语句
2. 如果已经提前预知错误的类型,就用if...else...来代替try...catch
何时: 今后只要处理无法提前预料的错误采用try...catch
try...catch用于处理浏览器兼容性问题:
比如: Ajax : XMLHttpRequest
抛出自定义错误: throw new Error("错误信息")
2. *****Function:
函数对象: 专门封装一个函数定义的对象
其实, js中一切函数都是引用类型的对象
创建: 3种
1. 以声明方式:
function 函数名(参数列表){函数体; return 返回值}
会被声明提前!
何时: 首选
声明提前(hoist): 在程序开始执行前
先将所有var声明的变量和function声明的函数提前到当前作用域的顶部,集中创建。
赋值留在原地
2. 函数直接量:
var 函数名=function(参数列表){
函数体;
return 返回值
}
不会被声明提前
何时: 不希望被声明提前时
3. 用new:
var 函数名=new Function("参数1","参数2",...,"函数体")
何时: 参数或函数体可能动态生成时
底层框架使用
鄙视题: function compare(a,b){return a-b;}
var compare=function(a,b){return a-b;}
var compare=new Function("a","b","return a-b");
重载(overload): 相同函数名,不同参数列表的多个函数,在调用时,可根据传入参数的不同,自动选择对应的函数执行。
为什么: 减少API的数量,减轻调用者的负担
何时: 今后一项任务,只是根据传入参数的不同,执行不同的操作时,就用重载。
如何:
问题: js的语法不支持重载,因为js中不允许同时存在多个同名函数。
解决:
arguments: 每个函数内自动创建的
自动接收所有传入函数的参数值的
类数组对象——长的像数组的对象
vs 数组: 相同: 1. 下标访问每个元素
2. length属性记录元素个数
3. 用for 遍历
不同: 不是数组类型
不能使用数组API
匿名函数:
什么是: 函数创建时没有被任何变量引用的
为什么: 节约内存
何时: 如果一个函数只用一次,不会重用
1. 所有回调函数,几乎都要用匿名
2. 匿名函数自调: 创建一个函数,立刻调用,调用后立刻释放。
主要目的: 为了定义一个临时函数作用域,避免全局污染
作用域(scope): 一个变量的使用范围
其实,作用域是一个对象,所有变量都保存在各自的作用域对象中。
函数的生命周期:
程序开始执行时:
创建执行环境栈(ECS):
依次保存正在调用的函数的执行环境 的数组
执行浏览器主程序(main):
创建window对象作为全局作用域对象
定义函数时:
在window中添加全局变量,函数名为变量名
创建函数对象,封装函数的定义
函数名变量引用函数对象
函数对象中有一个scope属性引用函数创建时的作用域对象
调用函数时:
在ECS中压入正在调用的函数的执行环境
创建本次函数调用使用的函数作用域对象(活动对象AO)
本次函数调用的EC引用着AO
在AO中定义parent属性,引用函数的scope指定的作用域对象。
在AO中添加局部变量的定义
变量使用的顺序:
先用局部的,如果没有,才去全局找
函数调用后:
将本次函数调用的EC出栈!
导致本次函数调用的函数作用域(AO)对象释放
导致局部变量一同释放
作用域链(scope chain):
在函数调用时
由各级作用域对象逐级引用形成的链式结构
作用域链控制着变量的使用顺序
先用局部的,如果没有,才去全局找
1. Date:
什么是: 封装一个日期,提供对日期执行操作的API
何时: 今后只要保存或操作日期都用Date对象
如何:
创建: 4种:
1. 获得客户端当前系统时间:
var now=new Date();
2. 创建日期对象保存自定义时间:
var date=new Date("yyyy/MM/dd hh:mm:ss")
new Date(yyyy,MM-1,dd,hh,mm,ss)
3. 复制一个日期:
为什么: 日期的计算都直接修改原日期对象
旧时间无法保存
何时: 如果需要同时保存计算前后的两个时间时,就必须将原日期复制一个副本再计算。
如何: var date2=new Date(date1);
4. 直接用毫秒数创建日期对象:
var date=new Date(ms)
原理: Date对象中保存的是1970年1月1日0点至今的毫秒数
API:
单位:年FullYear月Month日Date星期Day
时Hours分Minutes秒Seconds毫秒MilliSeconds
1. 每个单位都有一对儿getXXX/setXXX方法
getXXX()方法负责读取指定分量的值:
比如: date.getDate(); //获得几号
setXXX(n) 方法负责修改指定分量的值:
比如: date.setDate(10); //修改date的日期为10号
特例: Day没有set方法,因为星期只读,不可改
2. 取值范围:
只有月中的日(Date)从1开始到31结束
其余单位都是从0开始,到进制-1结束
Month 0~11 比现实中都小1 需要修正
Date 1~31
Day 0~6 星期日是0,不需要修正
Hours 0~23 不用修正
Minutes,Seconds 0~59 不用修正
日期计算:
1. 两日期相减: 获得毫秒差
2. 对任意单位做加减: 3步:
1. 取分量: var n=date.getXXX();
2. 做加减: n+=?;
3. 放回去; date.setXXX(n);
特点: 1. 自动调整进制
2. 直接修改原日期对象
简化版: date.setXXX(date.getXXX()+n)
转字符串:
.toString() --> 转为中国标准时间(+8区)
.toLocaleString() --> 转为系统当前时间格式
.toLocaleDateString --> 转为系统当前时间格式
仅包含日期部分
.toLocaleTimeString --> 转为系统当前时间格式
仅包含时间部分
.toGMTString() --> 转为国际标准时间(0时区)
1. ***Error:
错误: 在程序执行过程中,导致程序异常中断的特殊情况
错误处理: 在程序执行过程中,即使程序出错,也能保证不会异常中断的机制。
如何:
try{
可能出现错误的语句
}catch(err){//err: 自动获得错误对象——不可省略
一旦出错,才执行的错误处理代码: 提示错误, 记录日志
}finally{
无论是否出错,都必须执行的代码: 释放资源
}
Error: 封装错误信息的对象
在发生错误时,自动创建
err.name: 错误的名称
err.message: 错误的提示信息
js中包含6种错误:
SyntaxError: 语法错误
ReferenceError: 引用错误 要用的东西没找到
RangeError: 范围错误 专指参数超范围
TypeError: 类型错误 错误的调用了对象的方法
EvalError, URIError
原则: 1. try中尽量少的包含语句
2. 如果已经提前预知错误的类型,就用if...else...来代替try...catch
何时: 今后只要处理无法提前预料的错误采用try...catch
try...catch用于处理浏览器兼容性问题:
比如: Ajax : XMLHttpRequest
抛出自定义错误: throw new Error("错误信息")
2. *****Function:
函数对象: 专门封装一个函数定义的对象
其实, js中一切函数都是引用类型的对象
创建: 3种
1. 以声明方式:
function 函数名(参数列表){函数体; return 返回值}
会被声明提前!
何时: 首选
声明提前(hoist): 在程序开始执行前
先将所有var声明的变量和function声明的函数提前到当前作用域的顶部,集中创建。
赋值留在原地
2. 函数直接量:
var 函数名=function(参数列表){
函数体;
return 返回值
}
不会被声明提前
何时: 不希望被声明提前时
3. 用new:
var 函数名=new Function("参数1","参数2",...,"函数体")
何时: 参数或函数体可能动态生成时
底层框架使用
鄙视题: function compare(a,b){return a-b;}
var compare=function(a,b){return a-b;}
var compare=new Function("a","b","return a-b");
重载(overload): 相同函数名,不同参数列表的多个函数,在调用时,可根据传入参数的不同,自动选择对应的函数执行。
为什么: 减少API的数量,减轻调用者的负担
何时: 今后一项任务,只是根据传入参数的不同,执行不同的操作时,就用重载。
如何:
问题: js的语法不支持重载,因为js中不允许同时存在多个同名函数。
解决:
arguments: 每个函数内自动创建的
自动接收所有传入函数的参数值的
类数组对象——长的像数组的对象
vs 数组: 相同: 1. 下标访问每个元素
2. length属性记录元素个数
3. 用for 遍历
不同: 不是数组类型
不能使用数组API
匿名函数:
什么是: 函数创建时没有被任何变量引用的
为什么: 节约内存
何时: 如果一个函数只用一次,不会重用
1. 所有回调函数,几乎都要用匿名
2. 匿名函数自调: 创建一个函数,立刻调用,调用后立刻释放。
主要目的: 为了定义一个临时函数作用域,避免全局污染
作用域(scope): 一个变量的使用范围
其实,作用域是一个对象,所有变量都保存在各自的作用域对象中。
函数的生命周期:
程序开始执行时:
创建执行环境栈(ECS):
依次保存正在调用的函数的执行环境 的数组
执行浏览器主程序(main):
创建window对象作为全局作用域对象
定义函数时:
在window中添加全局变量,函数名为变量名
创建函数对象,封装函数的定义
函数名变量引用函数对象
函数对象中有一个scope属性引用函数创建时的作用域对象
调用函数时:
在ECS中压入正在调用的函数的执行环境
创建本次函数调用使用的函数作用域对象(活动对象AO)
本次函数调用的EC引用着AO
在AO中定义parent属性,引用函数的scope指定的作用域对象。
在AO中添加局部变量的定义
变量使用的顺序:
先用局部的,如果没有,才去全局找
函数调用后:
将本次函数调用的EC出栈!
导致本次函数调用的函数作用域(AO)对象释放
导致局部变量一同释放
作用域链(scope chain):
在函数调用时
由各级作用域对象逐级引用形成的链式结构
作用域链控制着变量的使用顺序
先用局部的,如果没有,才去全局找
相关文章推荐
- JS基础第2课:函数的声明以及ifelse语句
- JavaScript基础(基本语法:变量、语句、数组、函数、对象、全局方法以及js与java不同,js与html关联)
- JS基础回顾,小练习(判断数组,以及函数)
- Js基础回顾 - 函数作用域及js oop(1)
- js的函数作用域 以及声明提前
- js的函数作用域 以及声明提前
- javascript(js) join函数使用方法介绍
- MFC应用程序中消息以及函数的处理顺序介绍
- 基础的prototype.js常用函数及其用法
- Javascript笔记(一)——js以及json基础
- [转]介绍拦截器基础以及写法(struts2为基础)
- JavaScript基础:JS函数中声明的所有变量在整个函数中都是有定义的
- Javascript笔记一 js以及json基础使用说明
- 用js进行url编码后用php反解以及用php实现js的escape功能函数总结
- 用js进行url编码后用php反解以及用php实现js的escape功能函数总结
- JS中open()函数介绍
- javascript(js) join函数使用方法介绍
- jQuery框架学习第九天:jQuery工具函数介绍与使用
- C 语言标准 I/O 函数介绍以及演示程序
- js(javascript)自定义的DateAdd和DateDiff函数以及当前日期的取法