一、作用域
1.作用域的定义
作用域:变量起作用的范围
全局作用域:整个js全局起作用
局部作用域:在函数体中变量作用范围
代码如下(示例):
<script>
var num = 100 //全局作用域的变量
function fn(){
// 局部作用域
var num1 = 200 //num1的作用域为fn()函数体
console.log('num11 ',num)
function fun(){
var num2 = 300 //num2的作用域为fun()函数体
console.log('num2 ',num2);
console.log('num1 ',num1);
}
fun()
}
console.log('num22 ',num)
fn()
</script>
2.作用域的访问规则(针对变量)
①在当前作用域里面查找
②如果在当前作用域里面没有找到,就到上级作用域里面查找
③如果上级作用域里面没有找到,继续往上找,直到全局作用域
④如果全局作用域都没有,就会报错
以上的访问流程称为作用域链
代码如下(示例):
<script>
var num = 100
function fun1() {
var num1 = 200
console.log('fun1 num ',num)
function fun2() {
var num2 = 300
console.log('fun2 num ',num) // 3.如果上级作用域没有,接着向上找,至到全局作用域
console.log('fun2 num1 ',num1) // 2.如果当前作用域没找到,到上级作用域找
console.log('fun2 num2',num2) // 1.当前作用域找
console.log(num3) // 4. 如果全局作用域也没有, 直接报错Uncaught ReferenceError: num1 is not defined
}
fun2()
}
fun1()
</script>
3.作用域的赋值规则
①赋值前在当前作用域查找
②上级作用域查找,找到赋值
③上级作用域查找,直到全局作用域
④如果以上三个步骤都没有找到,就会将创建全局变量,然后赋值
代码如下(示例):
<script>
var num = 100
function fun1() {
var num1 = 200
function fun2() {
var num2 = 300 //赋值前在当前作用域查找
num1 = 400 // 上级作用域查找,找到赋值
num = 500 //上级作用域查找,至到全局作用域
num3 = 600 // 当前作用域查找,上级作用域查找,全局作用域查找,全局作用域也没查找到,将创建全局变量,然后赋值
console.log('num3 ',num3);
}
fun2()
}
fun1()
</script>
注意:内层可以访问外层函数作用域变量
外层不能访问内层作用域变量
二、递归函数
概念:函数自身调用自身,这样的函数称为递归函数
作用:后面结果由前面推导出来的,可以采用递归函数简化代码
代码如下(示例):
<script>
function fun(n){
if(n == 1){
return
}
console.log('fun ')
fun(n--)
}
fun(2)
</script>
注意:① 要有递归结束的条件
②改变递归条件的代码
递归函数示例:
代码如下(示例):
<script>
//求 1+2+3+4+5.....+100
// sum(5)
// sum(4)+5 //sum(5)
// sum(3)+4 //sum(4)
// sum(2)+3 //sum(3)
// sum(n-1)+n //sum(n)
function getSum(n){
if(n==1){
return 1
}
return getSum(n-1)+n
}
var sum = getSum(100)
console.log(sum)
</script>
三、对象
对象:面对对象
①现实生活中对象:具体一事物,对象有自己的特征行为
②软件世界:对象 Object ;属性 方法 ;属性名:属性值构成
obj称为对象名,也可以叫引用变量
对象属于复杂数据类型:
var obj = {
name:'jakc',age:18
}
obj 数据类型名 -----> Object
key/value---->键值对的集合
-
创建对象的两种方法
1.字面量方式:
var jackObj={ } //创建空对象
var jackObj={属性:属性值,
属性:属性值
}
代码如下(示例):
<script>
var jackObj = {
name:'jack', //姓名属性 => name属性名和jack属性值构成
age:18, // 年龄属性 => age属性名和18属性值构成
sex:'男' // 性别属性
}
</script>
2.构造函数方式
var Obj=new object()
obj.属性=属性值,
obj.属性=属性值
代码如下(示例):
<script>
var obj = new Object() //空对象
obj.name = 'jack',
obj.age = 18
</script>
-
对象的相关语法:
代码如下(示例):
<script>
// 1.创建对象:
var obj = { //obj称为对象名,也可以叫引用变量
name:'jack',
age:18,
sex:'男'
}
//2. 访问对象给定的属性值 //通过对象访问对象属性 对象名.属性名 ====>属性值
console.log('name :', obj.name)
console.log('age :',obj.age)
console.log('sex :',obj.sex)
// 3. 修改属性值
obj.name = 'rose'
console.log('name ',obj.name)
console.log(obj)
// 4. 删除属性
// delete obj.name
console.log(obj)
// 5. 添加属性
obj.score = 98
console.log(obj)
// 6. 遍历对象 for-in
for(var key in obj){
// key = 'name' key='age' ...
console.log('key ',key, ' value ',obj[key])
}
// 7. 访问属性值,属性名是变量情况
console.log( 'name ',obj.name)
var _name = 'name'
console.log(obj[_name])
console.log(obj['name'])
</script>
-
访问对象的示例:
代码如下(示例):
<script>
//创建对象
var student={
name:'噜噜菲',
num:'002',
sex:'女',
score:89,
grade:'02'
}
//添加属性
student.height=160
//删除属性
delete student.score
//遍历对象属性
for(var m in student){
console.log(m,student[m])
}
console.log(student)
</script>
四、数组
数组属于复杂数据类型 类型名为:Array
作用:存储一系列有序数列的集合
-
创建数组的两种方式
1.字面量方式
var arr=[ ] //创建空数组
var arr=[1,2,'jack',true]
代码如下(示例):
<script>
var arr = [10, 20, 30, 40]
</script>
2.构造函数方式
var arr=new Array()
代码如下(示例):
<script>
var arr1 = new Array(100, 200, 300, 400, 500)
</script>
-
对象的相关语法:
代码如下(示例):
<script>
//1. 创建数组
var arr = [10, 20, 30, 40]
// 0 1 2 3 索引号
//2. 访问数组元素
console.log('arr[0] :', arr[0], ' arr[1] :', arr[1])
//3. 数组长度
console.log('length >> :', arr.length)
//4. 遍历数组, 循环变量表示数组索引号从0开始
for (var i = 0; i < arr.length; i++) {
console.log(arr[i])
}
// 5. 创建数组只有一个元素, 表示创建一个空数组长度是5 length=5
var arr2 = new Array(5)
console.log('arr2.length >>> ', arr2.length)
for (var i = 0; i < arr2.length; i++) {
console.log(arr2[i])
}
// 6. 直接控制台打印
console.log(arr);
</script>
数组例题:
1. 创建一个学生成绩数组,存储所有学生的数学成绩,分别是 89,78,90,99,67,59
2. 求所有学生中分数最高的学生成绩,打印输出到界面
3. 求所有学生中分数最低学生成绩,打印输出到界面
4. 求不及格的学生有几个,打印输出到界面
代码如下(示例):
<script>
// 1. 创建一个学生成绩数组,存储所有学生的数学成绩,分别是 89,78,90,99,67,59
var scoreArr=[89,78,90,99,67,59]
// 2. 求所有学生中分数最高的学生成绩,打印输出到界面
var max=scoreArr[0]
// 依次让后面的数与最大值max比较,如果大于max,赋值给max
// 从数组第二个元素开始循环遍历数组,进行求最大值比较
for(i=1;i<scoreArr.length;i++){
if(max <scoreArr[i]){
max=scoreArr[i]
}
}
console.log('分数最高的学生成绩:',max) //控制台输出,所有学生中分数最高的学生成绩
// 3. 求所有学生中分数最低学生成绩,打印输出到界面
var min=scoreArr[0]
// 依次让后面的数与最大值min比较,如果小于min,赋值给min
// 从数组第二个元素开始循环遍历数组,进行求最小值比较
for(i=1;i<scoreArr.length;i++){
if(min > scoreArr[i]){
min=scoreArr[i]
}
}
console.log('分数最低学生成绩:',min) //控制台输出,所有学生中分数最低学生成绩
// 4. 求不及格的学生有几个,打印输出到界面
var count=0
for(i=0;i<scoreArr.length;i++){
if(scoreArr[i]<60){
count++
}
}
console.log('不及格人数是 ',count)
</script>
现有5名学生,语文成绩分别是98,87,95,89,77分,请定义一个成绩数组存储学生成绩并遍历输出 求5名学生总成绩? 求大于平均分的学生成绩?
代码如下(示例):
<script>
// 现有5名学生,语文成绩分别是98,87,95,89,77分,请定义一个成绩数组存储学生成绩并遍历输出
// 求5名学生总成绩?
// 求大于平均分的学生成绩?
var arr = [98, 87, 95, 89, 77]
function printArr() {
for (var i = 0; i < arr.length; i++) {
console.log(arr[i])
}
}
printArr()
//总成绩
// 98 + 87 + 95 + 89 + 77
function getTotalScore() {
var total = 0
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
total += item
}
console.log('总成绩是 ', total)
return total
}
var total = getTotalScore()
//平均分
var avg = total / arr.length
console.log('平均分 ', parseInt(avg))
//大于平均分成绩
for (var i = 0; i < arr.length; i++) {
if (arr[i] > avg) {
console.log(arr[i])
}
}
</script>
总结
以上就是今天要讲的内容,本文仅仅简单介绍了作用域、递归函数、对象、数组的相关知识,递归函数在程序中的使用是非常常见的,它可以很好地简化代码,数组的使用很重要的,它的相关语法都是以后我们经常能用到的。