一、短路赋值
var n = 1||2; // n = (1 || 2) n = 1 因为或运算遇到真就不会继续往下走所以n被赋予值1
var n = 0||3; //n = (0||3) n = 3 0 为flase继续往下走遇到3为flasen被赋值3
var n = 1&&2; //n = (1&&2) n = 2 与运算遇到假就会短路。1为真 继续向下 所以n = 2
var n = 0&&3; //n = (0&&3) n = 0 0为假 所以直接给n赋值0
二、变量的作用域
- 变量是有作用域的
- 分类
- 全局作用域 -- 全局变量 全局变量即在函数外声明的变量没有var的变量
2.局部变量 -- 局部变量
局部变量就是在函数内部声明的变量,只能在函数内部和函数被调用时使用,调用结束后销毁
- 变量可以重复声明,变量也可以不声明直接赋值,当函数内部的变量和外部的变量名字相同的时候优先使用自己的
- 在函数内没有var但直接赋值,此时会变成全局变量,但是要注意的是,若函数没有被调用此时这个全局变量也无法被访问
- 作用域是相对的
三、形参
- 形参本质上是一个局部变量,可以接收实参。和实参不对等,所以可以实现短路赋值法。
var a;
console.log(a) //undefined 变量已经声明,但是没有被赋值
// 形参的本质上是局部变量
- 函数嵌套下的变量的作用域 优先找自己的,自己的找不到就向上一级查找,一只找到script为止,一直找不到就报错
四、js的预编译
- js执行代码分为两个阶段
- 预编译阶段 首先会找到所有的var 声明的变量 然后找所有的具名函数
<script>
// 你看到的代码
function a(){
console.log(3);
}
console.log(a);
a = 1;
console.log(a);
function a(){
console.log(2);
}
console.log(a);
a = 3
console.log(a);
function a(){
console.log(3);
}
console.log(a);
a()
// 实际上
// 被覆盖
// function a(){
// console.log(3)
// }
// 被覆盖
// function a(){
// console.log(2)
// }
function a(){
console.log(3);
}
console.log(a); // 打印函数
a = 1;
console.log(a); // 1
console.log(a);
a = 3
console.log(a); //3
console.log(a);
a() //报错 此时a已经不是函数
</script>
五、函数
- 函数也是一种数据类型!function是引用数据类型,函数可以被变量存储
- 匿名函数:一次性函数,是一种立即执行的函数
- 匿名函数的自调用
!function(n){ //函数前加一个 + ! 或者 ~
console.log(n)
}("33") //后括号填写参数
2.一些系统函数
prompt() //有输入框的弹窗
confirm() //确定弹窗 有返回值 boolean
eval() //能计算的时候就计算,不能计算就报错
- 事件处理函数是后面才执行,也就是在点击后才执行。说明代码并不是永远自上而下执行的,影响到预编译。
六、递归函数
- 递归:传递与回归,自己调用自己
// 当传入的数为偶数时 调用函数求和 1/2 + 1/4 +。。。。+ 1/n
// 当数为奇数时候,1 + 1/3 +.....+ 1/n
// 不管是奇数偶数,计算都是1/n + 第n -2个数的和
function sum(n){
if(n == 1){
return 1;
}
if(n == 2){
return 1/2;
}
return 1/n + sum(n-2);
}
console.log(sum(2))
七.字符串的拼接
- 当返回很多个值的时候,使用字符串的拼接
// 作用:封装一个能生成规定位数验证码的函数
// 参数:x 规定几位数
// 返回值:string 一个规定位数验证码
function code(x){
// 短路赋值:当调用函数时x若没被赋值,触发短路赋值x的值为4
x = x || 4;
// 字符串的拼接
var n = "";
for(i = 0 ; i < x ; i++){
var j = suiji(0,9)
n += j
}
return n
}