1、函数
1、作用域
1、什么是作用域
表示的是函数或变量的可访问范围
JS中的作用域,分为两种:
1、函数作用域:只在声明的函数内有效
2、全局作用域:代码的任何位置处都有效
2、函数作用域中的变量
又称为:局部变量
function test(){
var num = 10;
// num 出了test 就失效
}
3、全局作用域中的变量
又称为:全局变量,一经声明,任何位置都能使用的变量
1、不在function中声明的变量为全局变量
2、声明变量不使用 var 关键字时,无论任何位置,声明的都是全局变量(不推荐)
4、面试题
1、以下代码的执行效果是什么
function showNum1(){
console.log(num);
console.log("以下是要声明的内容:");
var num = 1888;
console.log(num);
}
输出结果:
1、undefined (正确答案)
2、语法错误:num is not defined
3、1888
解析:声明提前
什么是声明提前:
JS程序在正式执行前,会将所有var声明的变量以及function声明的函数,都预读(事先声明)到所在作用域的顶部。但赋值还保留在原位
function showNum1(){
console.log(num);
console.log("以下是声明的内容:");
var num = 1888;
console.log(num);
}
等同于
function showNum1(){
var num;//预读到顶端
console.log(num);
console.log("以下是声明的内容:");
num = 1888;//赋值保留在原位
console.log(num);
}
2、以下代码的执行效果是什么
<script>
function change(a,b){
a = 500;
b = 300;
}
var num1 = 30,num2 = 50;
console.log(num1,num2);
console.log("调用chang函数");
change(num1,num2);
console.log(num1,num2);
</script>
1、
30 50
调用change函数
500 300
2、
30 50
调用change函数
30 50(正确答案)
解析:值传递
什么是值传递
基本数据类型的数据,在做参数传递时,都是按照"值传递"的方式来进行传参的。
值传递:真正传递参数值的时候,实际上传递的是值的副本(复制过来的一个数据),而不是原始的值
5、函数的作用域
函数的作用域也分为2种:
1、局部函数
在某个function内声明的函数
2、全局函数
在最外层(<script>)定义的函数,就是全局函数,全局函数一经定义,任何位置都能使用
6、ECMAScript 提供了一组全局函数
1、parseInt()
2、parseFloat();
3、isNaN();
4、encodeURI()
URI:Uniform Resource Identifier
统一资源标识符
URL:Uniform Resource Locator
统一资源定位器
encodeURI()的作用:
对符合统一资源标识符的数据进行编码,并返回编码后的字符串。所谓的编码,就是将地址中的多字节的文字编译成单字节的文字
佳:占2~3字节,在URI的规范中,就不能出现中文,只能将中文进行编码
5、decodeURI()
作用:对已编码的URI进行解码,即将单字节内容解析成一个文字字符
6、encodeURIComponent()
对URI的组件也能进行编码(允许把特殊符号也进行编码)
7、decodeURIComponent()
对已编码的URI组件进行解码
8、eval()
作用:执行以字符串方式表示的JS代码
2、特殊的调用 - 递归
1、什么是递归
在一个函数的内部再一次调用自己
问题:计算 5! (5*4*3*2*1)
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1
通过一个函数,求数字 n 的阶乘
function f(n){
//求数字 n 的阶乘的实现
//递归条件
if(n == 1){
return 1;
}else{
return n * f(n-1);
}
}
ex:
f(5) : 求5!
f(10) : 求10!
效率:
在本次调用还未结束时,就开始了下一次的自己的调用,那么本次的调用就会被挂起,直到所有的调用都完成之后,才会依次返回。所以递归调用次数越多,效率越低。
2、分支结构
1、结构分类
1、顺序结构
自顶向下,将所有的代码都执行一遍
2、分支结构
根据条件选择某部分代码去执行
3、循环结构
根据条件选择某部分代码反复的执行
2、if结构
1、语法
if(条件){
语句块
}
如果条件为真,则执行语句块中的内容,否则什么都不执行
注意:
1、条件尽量是boolean的,如果不是boolean的,则会发生条件的自动转换
以下条件值,会当成false去处理:
if(0){}
if(0.0){}
if(""){}
if(null){}
if(undefined){}
if(NaN){}
ex:
if(35){} 真
if("李文真帅"){} 真
if(""){} 假
2、if后的{}是可以省略的
省略后,if只控制其下面的第一条语句
建议:尽量不要省略if后的{}
3、if ... else ...
语法:
if(条件){
语句块1
}else{
语句块2
}
如果条件为true的话,则执行语句块1的内容,否则,则执行语句块2的内容
4、if...else if...else if...else
语法:
if(条件1){
语句块1;
}else if(条件2){
语句块2;
}else if(条件3){
语句块3;
}...else{
语句块n
}
先判断条件1,如果为真,则执行语句块1
否则 判断条件2,如果为真,则执行语句块2
否则 判断条件3,如果为真,则执行语句块3
如果以上条件都不满足,则执行语句块n
else是可选的,可有可无
5、switch...case
1、作用
等值判断
2、语法
switch(变量/表达式){
case 值1:
语句块1;
break;//结束switch结构,可选的
case 值2:
语句块2;
break;//结束switch结构,可选的
default:
语句块n;
break;//结束switch结构,可选的
}
注意:
1、switch后的表达式或变量,与case之间在做比较时,使用 === 判断的
3、特殊用法
switch(变量/表达式){
case 值1:
case 值2:
case 值3:
语句块1;
break;
... ...
}
3、循环结构
1、什么是循环
反复的执行相同或相似的代码操作
2、循环特点
1、循环条件 :循环的开始和结束
2、循环操作 :要执行的相同或相似的语句
3、循环 - while
1、语法
while(条件){
//循环操作/循环体
//更新循环条件
}
2、循环的流程控制
1、break
作用:终止整个循环结构的执行
2、continue
作用:终止本次循环,继续执行下一次的循环操作