***函数:封装一项任务的步骤清单的代码段,再起一个任务名
何时使用:发现一项任务,被反复调用,要先将任务步骤封装为一个函数,再反复调用
如何声明函数:
function 任务名([参数变量类表]){
步骤清单代码段
[return返回值]
}
如何调用函数:函数名([参数值类表])
强调:
1.函数只有被调用时才会被执行
2.函数可被反复调用 --代码重用
参数变量:专门接收方法执行必须的数据变量
何时使用:如果一个函数,必须提供指定数据,才能正常执行时,需要提供几个数据,就定义几个参数接收
如何定义参数:不需要var,直接在函数名后的括号中定义参数名 --每个参数名之间用逗号分割
何时,如何传入参数值:调用时,按照参数定义的个数和顺序传入
为什么使用参数:参数可让方法变的更加灵活
***内存中函数的生命周期:
1.定义时:将函数直接封装在一个对象中保存 --函数对象
***函数名:其实是指向函数对象的一个变量
***定义时,不会读取函数的内容
2.调用时:在执行环境中增加一个当前函数的执行环境对象,才会逐行读取并执行函数的内容
3.调用后:函数的执行环境和活动对象,弹出
***作用域:一个变量的可用范围
本质其实是一个存储多个变量的对象
2种:
1.全局作用域:专门保存全局变量的对象
全局变量:在任何时候,任何位置都可以被访问
2.函数作用域:专门保存函数内部的局部变量的对象 --活动对象
局部变量:
2类:
1.参数变量
2.在函数声明的变量(var)
--只在函数调用时的函数内部才可以使用
笔试题:
例1:局部变量
var n=100; function fun(n){ n++; console.log(n); } fun(100);//101 console.log(n);//100
例2:使用全局作用域:
var n=100; function fun(){ n++; console.log(n); } //没有自带的n,到全局中找n,将n带入,结果为 fun();//101 console.log(n);//101
返回值:函数调用的执行结果
何时使用:只要函数的执行,需要明确的返回值结果时;要看调用者是否需要获得执行结果
如何定义返回值:在函数定义结尾:return 返回值
如何获得返回值:
调用时: var 变量=函数名(xxx);
***按值传递:两变量间赋值或向函数中传递参数时,都是将原变量中的值复制一个副本给对方
即:修改一方,另一方不熟影响
例1:
var n=100; var m=n;//按值传递:n将自己的值,复制一个副本给m,该m,不影响n,反之亦然 n++; console.log(m);//100 两个互不影响
例2:
function buy(card){ card-=3; console.log(card); } var card=10; buy(card);//7 console.log(card);//10
***声明提前:在正式执行程序前,都会先预读所以var 声明的变量
function声明的函数,集中到当前作用域的顶部集中声明 ***赋值留在原地***
定义函数的第二种方式:
var 函数名=function(参数){函数体;return 返回值}
=100
例:
var fun; fun=function(){ return 1; }; console.log(fun());//1 fun=function(){ return 2; }; console.log(fun());//2 fun=100; console.log(fun);//100 console.log(fun());//报错
第二种方法,函数定义不会被提前,仅函数名提前
声明函数,整体(函数名+函数定义)提前
问题一:如果一个表达式或者函数有结果,就可直接当一个值用
问题二:如果传入参数个数不符,不会报错;个数超了;多出的没用;个数不够,未接到值得参数变量,默认值undefined
问题三:在函数内,为没声明过的变量赋值,变量会被自动创建在全局 -->危险
强烈建议:所有变量使用前,必须用var声明
问题四:return 特点:
1.return 与返回值之间不能加回车
2.return 不能放在其他表达式中间使用
*全局函数:ES标准中规定的,浏览器厂商已经实现的,不需要任何对象即可直接调用的函数
干扰项:BOM,凡是在BOM阶段讲的都不是全局函数
手册中:JavaScript->JavaScript对象->jsfunctions
encodeURI:对包含多字节符的url字符串编码为单字节符组成
decodeURI:将encodeURI编码后的字符串,解码为原文
为什么:url不允许包含多字节字符:比如汉字
问题:url还不允许包含保留的特殊符号:比如:/
解决:encodeURIComponent/decodeURIComponent
eval:专门执行字符串格式的js语句 --eval("alert(‘hello’)")
还可计算字符串格式的表达式的值
infinity:无穷的的意义
除数为0,(js中除数可以为0),结果为infinity,无穷大,可参与关系运算
函数:isFinite(num):专门判断一个数字是否在有效范围内
*分支结构:
程序分为3种结构: 顺序 分支 循环
顺序:除去声明提前,其余代码默认都从上向下顺序执行
分支:根据不同的条件,执行不同的代码
循环:让程序反复执行一段相同代码
分支情况:3种情况:
1.一个条件,一件事,满足条件就做,不满足就不做
如果操作简单:利用短路:条件&&(操作)
如果操作复杂:if(条件){操作代码}
//如果满足条件,就执行操作
2.一个条件,两件事,就满足条件做第一件事,不满足做另一件事
如果操作简单:三目:条件1?操作1:操作2;
如果操作复杂:if(条件){
满足才执行的代码
(如果前一个条件满足,则不再继续判断)
}else{
不满足才执行的代码
}
完整的分支结构,都是必须且只能多选一执行
3.多个条件,多个事,多选一执行,可一件都不执行
简单操作:三目:条件1?操作1:
条件2?操作2:
条件3?操作3:
如果复杂操作:if(条件1){
操作1
}elseif(条件2){
操作2
}elseif(条件3){
操作3
}elseif(条件4)
。。。。
}
强调:2点
1.最后的else可省略,一旦所有条件都不能满足,则什么都不做
2.条件可以任意关于运算或逻辑运算
只要返回true和false的函数或表达式,都可当条件用