作用域
变量起作用的范围
全局作用域和局部作用域
局部作用域:在函数体中作用范围
全局作用域:整个js代码全局起作用
内层可以访问外层作用域变量
外层不能访问内层作用域变量
<script>
var num = 100
function fn(){
// 局部作用域
var num1 = 200
console.log('num11 ',num)
function fun(){
var num2 = 300
console.log('num2 ',num2);
console.log('num1 ',num1);
}
fun()
// console.log('num2 >>> ',num2);
}
// console.log('num1 ',num1) // Uncaught ReferenceError: num1 is not defined
console.log('num22 ',num)
fn()
</script>
作用域访问规则
1.当前作用域找
2.如果当前作用域没找到,到上级作用域找
3.如果上级作用域没有,接着向上找,至到全局作用域
4. 如果全局作用域也没有, 直接报错 Uncaught ReferenceError: num1 is not defined
<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>
作用域赋值规则
赋值前在当前作用域查找
上级作用域查找,找到赋值
上级作用域查找,至到全局作用域
当前作用域查找,上级作用域查找,全局作用域查找,全局作用域也没查找到,将创建全局变量,然后赋值
<script>
var num = 100
// var num3
function fun1() {
var num1 = 200
function fun2() {
var num2 = 300 //赋值前在当前作用域查找
num1 = 400 // 上级作用域查找,找到赋值
num = 500 //上级作用域查找,至到全局作用域
num3 = 600 // 当前作用域查找,上级作用域查找,全局作用域查找,全局作用域也没查找到,将创建全局变量,然后赋值
console.log('num3 ',num3);
}
fun2()
}
fun1()
</script>
作用域链
递归函数
递归函数
=> 函数自身调用自身 这样的函数称为递归函数
=> 注意:
1. 递归结束的条件
2. 改变递归条件的代码
递归函数作用
递归解决那些问题?
后面结果由前面推导出来,可以采用递归简化实现
<script>
// 1 + 2 + 3 求和
function f(n){
//结束条件
if(n==1){
return 1
}
return f(n-1) + n
}
var sum = f(3)
</script>
递归实例
1 * 2 * 3 * 4 * 5 = ?
分析:
f(5)
=> f(4) * 5 ↑
=> f(3) * 4 ↑
=> f(2) * 3 ↑
=> f(1) * 2 ↑
1
f(n) = f(n-1) * n
function f(n){
if(n == 1){
return 1
}
return f(n-1) * n
}
var m = f(4)
console.log('前三项乘积',m)
对象
对象
面向对象
现实生活中对象
具体一个事物
张三同学
对象有自己的特征行为
软件世界
对象 object
属性 方法
创建对象
var jackObj = {} //创建空对象
var jackObj = {
name:'jack', //姓名属性 name属性名和jack属性值构成
age:18 //年龄属性 age属性名和18属性值构成
sex:'男' //性别属性
}
数据类型
基本数据类型
var num 100 /number
var name 'jack' //string
复杂数据类型
var obj {name:'jack',age:18}
var obj {name:'jakc',age:18}
obj 数据类型名->object
创建对象new语句
字面量方式
var obj =
name:'jack',
age:18
构造函数方式
var obj=new object()//空对象
obj.name ='jack',
obj.age 18
//创建一个姓名是jack,年龄是18岁,性别是男的对象
//obj称为对象名,也可以叫引用变量
//通过对象名访问对象属性对象名.属性名->属性值
<script>
var obj = {
name: 'jack',
age: 18,
sex: '男'
}
//访问对象给定属性的值
console.log('name:', obj.name);
console.log('age:', obj.age);
console.log('sex:', obj.sex);
//修改属性值
obj.name = 'rose'
obj.sex = '女'
console.log(obj.name);
console.log(obj)
//删除属性
// delete obj.name
console.log(obj)
//添加属性
obj.score = 98
console.log(obj)
//遍历对象for-in
for (var key in obj) {
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>
创建一个名为student的学生对象,有属性学号num,性别sex,班级grade, 成绩score, 姓名name
<script>
var student = {
num:'001',
sex:'男',
grade:'2208班',
score:100,
name:'小明'
}
// console.log('name:',student.name);
// console.log('sex:',student.sex);
// console.log('grade:',student.grade);
// console.log('score:',student.score);
// console.log('num:',student.num);
for(var key in student){
console.log('student ', key, 'value', student[key])
}
student.city='上海'
for(var key in student){
console.log('student ', key, 'value', student[key])
}
delete student.num
for(var key in student){
console.log('student ', key, 'value', student[key])
}
student.city='成都'
student.name="小红"
student.sex='女'
for(var key in student){
console.log('student ', key, 'value', student[key])
}
</script>
数组
数组 Array
数组
1. 作用: 存储一系列有序数据的集合
2. 创建数组
var arr = [] //创建空数组
var arr = [1,2,'jack',true]
0 1 2 4
3. 索引号(下标)
4. 访问数组元素
arr[0]
5. 数组长度 (元素个数)
length属性
arr.length
6. 遍历数组
for
7. 创建数组方式
构造函数
var arr = new Array() 空数组
字面量
var arr = [] 空数组
<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. 构造函数创建数组
var arr1 = new Array(100, 200, 300, 400, 500)
for (var i = 0; i < arr1.length; i++) {
console.log(arr1[i])
}
// 6. 创建数组只有一个元素, 表示创建一个空数组长度是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])
}
// 7. 直接控制台打印
console.log(arr);
</script>
数组练习题
<script>
/*
1. 创建一个学生成绩数组,存储所有学生的数学成绩,分别是 89,78,90,99,67,59
2. 求所有学生中分数最高的学生成绩,打印输出到界面
3. 求所有学生中分数最低学生成绩,打印输出到界面
4. 求不及格的学生有几个,打印输出到界面
*/
// 1. 创建一个学生成绩数组,存储所有学生的数学成绩,分别是 89,78,90,99,67,59
var scoreArr = [89, 78, 90, 92, 47, 59, 98]
// 2. 求所有学生中分数最高的学生成绩,打印输出到界面
// 假设第一个数是最大值
var max = scoreArr[0]
// 依次让后面的数与最大值max比较,如果大于max,赋值给max
// 从数组第二个元素开始循环遍历数组,进行求最大值比较
for (var i = 1; i < scoreArr.length; i++) {
if (scoreArr[i] > max) {
max = scoreArr[i]
}
}
console.log('最大值 ', max)
/*
4. 求不及格的学生有几个,打印输出到界面
分析: 遍历学生成绩数组, 与60比较,如果小60不及格,计数器加一
*/
var count = 0 //计数
for (var i = 0; i < scoreArr.length; i++) {
if (scoreArr[i] < 60) {
count++
}
}
console.log('不及格人数是 ',count)
</script>
练习题2
<script>
/*
现有5名学生,语文成绩分别是98,87,95,89,77分,请定义一个成绩数组存储学生成绩并遍历输出
求5名学生总成绩?
求大于平均分的学生成绩?
有一个存储两个数的数组[3,6]写程序交换数组元素,输出[6,3]
*/
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])
}
}
// 有一个存储两个数的数组[3,6]写程序交换数组元素,输出[6,3]
function swap() {
var arr1 = [3, 6]
console.log(arr1) // arr1[0] :3 arr1[1]: 6
var temp = arr1[0]
arr1[0] = arr1[1]
arr1[1] = temp
console.log(arr1)
}
swap()
</script>
页脚