1 function 函数 也叫做方法 以后可以反复使用的
1、创建函数并且调用:2种
1、声名方式创建
function 函数名(){
函数体;
return 返回值;
}
2、直接量创建函数 函数名其实就是一个变量名
var 函数名=function(形参列表){
函数体;
return 返回值;}
return 本意是 退出函数的意思 只负责返回不负责保存 用一个变量接住结果
function f1() {
var a = 100;
return a; //return只负责返回,不负责保存
}
var result = f1();
console.log(result);
2、做用域:2种;
1、全局作用域 全局变量和全局函数在任何地方都可以使用的
2、局部作用域 局部变量和局部函数在(函数调用时在内部使用)
规则:优先使用局部的,局部没用找全局,全局没有就会报错。
特殊:1、不要对未声名的变量直接赋值,a=1 .会全局污染,全局没有被突然添加上了一坨。
2、局部的东西,全局不能用
3、那怕没有写return其实也有return只不过后面跟的是undefined
4、return一般出现在最后面,而且只能出现一次
5、往往前辈们提供的方法后面都有一个return操作,可能前辈们觉得以后用这些方法 的人,可能拿着此方法的结果拿去做后续操作。
3、声名提前
在程序正式运行之前 将var声名的变量(轻),和function声名的函数(重)都会悄悄地集 中的提前到当前作用域的顶部,但是赋值留在原地。
声名方式的函数会完整的提前,直接量的方式创建的函数不会完整提前,只有变量部分会提 前。
何时使用:基本不会使用。
只要你遵守以下规则:
1、变量名和函数名尽量不要重复
2、先创建后使用
3、如果是先用后创建,可能多半是在考你声名提前。
var a=1;
function f1(){
console.log(a);
var a=100;
console.log(a);
}
f1();
console.log(a);
var a=1;
function f1(){
var a
console.log(a);(报错)
a=100;
console.log(a);100
}
f1();
console.log(a);1function f1(){
console.log(a); 2、10
a=20;
console.log(a); 3、20
}
console.log(a); 1、 undefined
var a=10;
f1();
console.log(a); 4、20
a=100;
console.log(a); 5、100
4、按值传递:两个变量之间到的赋值 分两种情况
如果传递的是原始类型的值
修改一个变量不会影响另一个变量,其实复制一个副本给对方。
如果是引用类型的对象,修改一个变量,另一个变量也会受影响,引用类型根本没有保 存到变量之中,只是保存了一个地址,两者同用一个地址,所以会相互影响。
/ var a=1;
// var b=a;
//
// b++;
//
// console.log(a);
// console.log(b);
// var arr1=[1,2,3,4,5];//arr1其实只是保存到了一个地址值
// var arr2=arr1;//arr1吧地址值给了arr2,两者用的同一个地址值,所以会相互修改
//
// arr1.length--;
// arr2.length--;
//
// console.log(arr1);
// console.log(arr2);
备注 原始类型 string(字符串) number(数字) undefined boolean(true 和false) null
2、预定义全局函数:前辈们提前定义好的,我们程序员可以直接使用的,在任何位置都可以使用
*parseInt/Float/isNaN/eval... 其实都是预定义全局函数,但是alert/prompt不属于我们现在学 的范畴:确实也是全局预定义函数,只不过属于BOM
1、编码和解码
问题:url中不允许出现多字节字符(汉字,utf-8编码格式下,一个汉字占3字节),如果出 现会乱码
解决:发送前,前端将多字节字符编码为单字节字符(数字、字母、符号)
发送后,后端将单字节字符在解码为多字节原文
如何:
编码:var 不认识=encodeURIComponent("大梵");
解码:var 原文=decodeURIComponent(不认识);
这个东西没有用,在某一次浏览器更新后,当前就被淘汰了,浏览器自带此功能 - 唯一的用 处,现在就是玩了:悄悄话
2、isFinite(num):判断num是不是有效范围 - 垃圾并不能用于判断是不是NaN,因为有三个人会是 false
哪些会为false:NaN,Infinity,分母为0
3、***分支结构:根据条件的不同,选择部分代码执行
1、if分支
var score=prompt("请输入您的分数");
if(score>=90){alert("奖励一台兰博基尼");}
else if(score>=80){alert("奖励一台A6");}
else if(score>=70){alert("奖励一台自行车");}
else if(score>=60){alert("奖励一台奥迪双钻");}
else{alert("奖励钉子皮托烟锅巴");}
2、三目&短路
5 > 3 && alert("对的");(前面是条件,满足就做后面的)
console.log(score>=90?"奖励一台兰博基尼":score>=80?"奖励一台奥迪A6":score>=70?"奖励一 台自行车":score>=60?"奖励一台奥迪双钻":"奖励钉子皮托烟锅巴");(备注默认操作不能省略)
score==90&&"奖励一台兰博基尼"
3、switch...case...语法
switch(变量/表达式){
case 值1:
操作1;
case 值2:
操作2;
case 值3:
操作3;
default:
默认操作;
}
var user=parseInt(prompt("欢迎使用10086查询系统: \n1、查询余额 \n2、查询流量 \n3、 查询套餐 \n4、人工服务"));
switch(user){
case 1:
alert("正在查询余额...");
break;
case 2:
case 3:
alert("正在维护...");
break;
case 4:
alert("正在转接人工...");
break;
default:(默认操作)
alert("暂无此功能");
}
特殊:1、不具备隐式转换
2、问题:默认只要一个case满足后,就会将后面所有操作全部做一次
解决:break;
建议:每一个case的操作后都要跟上一个break
有的地方可以不加break:
1、最后一个操作default可以省略break
2、如果中间连续的多个操作,是相同的,也可以省略掉中间部分
面试题:if vs switch
1、switch:缺点:必须要知道最后的结果才能使用,不能做范围判断
优点:执行效率相对较高
2、if : 优点:可以做范围判断
缺点:执行效率相对较慢
建议:代码优化:尽量的将if替换为switch或者三目或短路