【JavaScript】函数 、 分支结构

【JavaScript】函数 、 分支结构
1. ***函数: 步骤清单,再起一个任务名
为什么: 代码重用!
何时使用: 只要一段代码可能被多次调用,就要先封装在函数中,再反复调用函数。
如何使用:
声明: 创建一个函数,封装一段代码,再起个名字
function 函数名(参数列表){
函数体;
return 返回值;
}
参数: 接收函数执行时的必要数据的变量
为什么: 让函数变得更灵活
何时定义: 如果函数必须一些数据才能正常执行时
返回值: 函数执行的结果
何时定义: 如果调用者需要获得函数的执行结果时
调用: 让引擎找到函数,并按照函数的步骤执行任务
var 返回值=函数名(参数值列表);

作用域(scope): 变量的可用范围
全局作用域: 全局变量
特点: 任何位置都可访问,可反复访问
函数作用域: 局部变量
特点: 只能在函数内部访问,函数外,不能访问

 

vs Java: 3种:
全局作用域:
函数作用域:
块级作用域:

*****函数的生命周期:
程序开始执行:
创建执行环境栈:ECS: 依次保存每个函数调用的执行环境的数组
在ECS中,默认添加全局执行环境(EC),全局EC引用window对象
window对象中保存所有全局变量和函数
声明函数:
创建函数对象
在全局添加函数名为变量
函数名变量引用函数对象
调用函数时:
创建活动对象(AO): 在函数调用时,专门保存局部变量的对象
生命周期: 调用函数时自动创建
函数调用后自动释放——局部变量一同释放
向ECS中添加一个新的EC,引用正在调用的函数的AO
执行时:
优先使用AO中的局部变量
如果AO中没有,就去window中找
调用后:
当前函数的EC出栈,AO被释放,局部变量一同释放

***声明提前:
在程序开始执行前,都会将var声明的变量和function声明的函数提前到当前作用域的顶部,集中创建。
赋值留在原地。

***按值传递:
两变量间赋值时或将变量作为参数传入函数时
其实都是将原变量的值复制给对方
对于原始类型: 修改新变量,不会影响原变量
对于引用类型: 修改新变量,?

 

例题
题目:输入某年某月某日,判断这一天是这一年的第几天? 


分析

程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊情况,闰年且输入月份大于 3 时需考虑多加一天。 

自己写的代码(不知道对不对)

function main(y,m,d){
					y=Number(y);
					m=Number(m);
					d=Number(d);
				switch(m){
					case 1:m=0;break; 
					case 2:m=31;break; 
					case 3:m=59;break; 
					case 4:m=90;break; 
					case 5:m=120;break; 
					case 6:m=151;break; 
					case 7:m=181;break; 
					case 8:m=212;break; 
					case 9:m=243;break; 
					case 10:m=273;break; 
					case 11:m=304;break; 
					case 12:m=334;break; 
					default:alert("输入无效");break; 
				}
				m=m+d;
				alert(m);
				if (y%4==0&&y%100!=0||y%400==0){
					r=1;
				}else{
					r=0;
				}
				if(r==1&&m>2){
					m++;
				}
			}
			main(prompt("请输入年份"),prompt("请输入月份"),prompt("请输入日"));

1. 全局函数: ES标准中规定的,不需要任何对象就可直接访问的函数
包含: W3C手册->JavaScript->JavaScript->JavaScript对象
->JS Functions
编码解码:
问题1: url标准规定,在url中不允许出现多字节字符
比如: 汉字
wd=宋 小 宝
wd=%E5%AE%8B %E5%B0%8F %E5%AE%9D utf-8编码
解决: 编码:将url中的多字节字符,转化为单字节字符
var url=encodeURI("url");
解码: 将编码后的url,解码回原文
var url=decodeURI("url");
问题2: url标准规定,url中不允许出现保留字符:
比如: : /
解决: 编码: encodeURIComponent("url")
解码: decodeURIComponent("url")

eval: 专门执行字符串格式的表达式:
何时使用: 用于将收到的服务器响应字符串转化为程序中的代码
如何使用: eval(str)
强调: 普通模式下: eval中代码的作用域就是eval所在的作用域
严格模式下: eval自己一个作用域
eval中声明的变量或函数,在eval外不能用

isFinit: 专门用于判断一个数是否在有效范围内
infinity: js中除数可以为0,结果为infinity,表示无穷大
判断一个结构是否为无穷大: var bool=isFinite(num)
num在有效范围内,返回true
num是NaN或Infinity,返回false

2. 分支结构: 根据不同的条件,执行不同的操作
隐式转换: 分支结构中的条件都默认转为bool类型
1. 一个条件,一件事,满足才做,不满足就什么也不做
如果操作简单: 短路逻辑: 条件&&(操作1,操作2,...)
如果操作复杂: if(条件){操作}
2. 一个条件,两件事,二选一执行
如果操作简单: 三目(条件,三元)运算
如何使用: 条件? 操作1 : 操作2
如果根据不同的条件选择不同的值: 条件?值1:值2
在值1和值2中二选一。
如果操作复杂: if(条件){操作1}else{操作2}
3. 多个条件,多件事,多选一执行
如果操作简单: 三目运算
如何使用: 条件1?操作1:
条件2?操作2:
...?...:
默认操作;
如果根据不同条件返回不同的值:
条件1?值1:
条件2?值2:
...?...:
默认值
如果操作复杂: if(条件1){操作1}
else if(条件2){操作2}
... ...
else{默认操作}
如果条件都是等值比较: switch case
如何使用: switch(表达式){
case 值1:
操作1;
case 值2:
操作2;
case ...:
...
default:
默认操作
}
先计算表达式的值
用表达式的值和每个case做*全等*比较
如果表达式的值等于case的值,就进入case执行操作
问题: 入口case及其之后的所有case都会执行
解决: break; 中止并退出当前结构
如何使用: 默认,每个case之间都要用break分隔
何时不需要加break: 1. 最后一个不用加break
2. 相邻两个case执行相同操作时,之间不用加

关于默认操作:
三目运算: 最后一个默认值或默认操作,不能省略
if else: 最后一个else可省略,后果,如果所有条件都不满足,则什么也不执行.
switch case: 最后一个default也可省略

李东辉

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:18   其中:访客  17   博主  1

  1. avatar 吾萌小筑 2

    干货呀,上学的时候就觉得js挺难的

  2. avatar 历史碎片 2

    这个我能看懂,更高级的就没戏了

  3. avatar 米粒博客 4

    这玩意 不给我弄个实例 我都搞不懂

    • avatar 李东辉 5

      @米粒博客 实例代码写的太多了,自己写的,应该还有更简便的

  4. avatar 生晓's blog 4

    博主最近在研究JavaScript啊。推荐你上mooc看看

    • avatar 李东辉 5

      @生晓's blog 全部课程 | MOOC学院
      这个吗?
      可以看看
      打算买本犀牛书看看

  5. avatar 小易分享网 5

    今天才发现你的博客,连着看了几篇呢

  6. avatar 奇虎分享网 5

    感谢分享 祝您开心快乐每一天!

  7. avatar zposz 5

    糖芥网-美女图片 http://www.838pay.com/