1.作用域及使用
<script>
// var age = 18 //全局作用域
// function fn() {
// var age = 20
// }
// fn()
// console.log(age)
// console.log(fn(age))
// 变量作用域:全局作用域和局部作用域下可以定义相同的变量名,不会出现变量覆盖的情况下
/*
全局变量:在全局作用域下的变量
// 特点:代码在任何位置都可以使用
// var 声明的变量是全局作用域(在全局作用域下)
局部变量:在局部作用域下的变量
// 特点:局部变量只能在该函数使用
// var在局部作用域下定义的变量就是局部变量
局部作用域下只会在局部作用域下查找需要的变量,如果局部作用域没有这个变量,会向全部作用域查找
*/
// 函数中的形参是局部变量
// 全局变量只有在浏览器关闭的时候才会销毁,局部变量在函数运行结束后才会销毁
// var num = 20 //全局变量
// function fn() {
// console.log(num);
// var num = 30//局部变量
// // console.log(num);
// }
// fn()
// // console.log(num);
var a = 10
console.log(a);
function fun() {
alert(a)
var a = 20
alert(a)
}
fun2()
2.作用域链
作用域链:函数之间的链条,也就是说一个函数可以访问宁一个函数内的变量(内部函数可以访问外部函数的变量 , 外部函数没办法访问内部函数的变量 , 每个函数都是独立的作用域 , 但是内部函数属于外部函数)
采取的是就近原则
如果函数内套函数,两个函数都需要调用,否则不调用的函数不会执行
案列:
<script>
function fn() {
var num = 20
console.log(num);
function fn1() {
var age = 30
console.log(age);
}
}
fn()
</script>
3.js的预解析(重要)
// 预解析:js代码是由浏览器中的js解析器进行执行的
/*
ja代码执行分两步: 1.预解析 2.执行代码
*/
// 代码是自上而下执行的
// 预解析“是在当前作用域下,js代码执行之前,浏览器会默认把带有var 以及function 声明的变量在内存中提前声明
// 声明在整个作用域最前面
4.对象(重点)
// 对象:万物皆对象
/*
1.new关键字
2.字面量
*/
// 1.new关键字
// var obj = new Object()
// console.log(obj);
// // 字面量
// var obj = {}
// console.log(obj);
// 为什么需要对象,它是可以保存一个人的完整信息
// 给对象里面存东西时 是 对象名.属性名=属性值
// 对象里面时属性名: 属性值 存在
var uname = '张三'
var age = 18
var sex = '男'
var obj = {}
obj.uname = '张三'
obj.age = 18
obj.sex = '男'
console.log(obj)
5.基本数据类型和引用数据类型
基本数据类型值是存在栈里,引用数据类型值是存在堆里,栈里直接通过url地址指向堆里的值,所以在改变引用数据类型时,赋值给其他引用数据类型的值也会改
6.对象的特点
<script>
/*
对象:把相关的属性和方法放在一起的集合
对象需要属性名和属性值(键值对,键:name,值:'张三')
对象的属性名没有特殊要求
通过 属性名.属性值 给对象添加数据时,属性名不能是数字,否则会报错
可以通过 对象名['属性名'] 来添加数据
如果通过 对象名['属性名'] 的方式添加了数字型的大属性名时,需要用 对象名['属性名'] 来获取属性值
*/
var obj = {
name: '张三',
111: 123456
}
obj[111] = '你好'
var arr = ['张三', '18', '男']
console.log(obj[111]);
console.log(obj);
</script>
7.三种对象创建方式
三种创建方式
1.字面量
var obj={
name:'张三',
age:18,
getStudy:function(){
console.log('学习使我快乐')
}
}
obj.getStudy()
2.new关键字
var obj=new Object()
obj.name='张三'
obj.age=18
obj.getStudy=function(){
console.log('学习使我快乐')
}
obj.getStudy()
3.构造函数:函数名首字母一定要大写 需要new 构造函数()调用
function Get(name, age) {
this.name = name
this.age = age
}
var obj = new Get('张三', '18')
console.log(obj);
8.判断对象中的属性
<script>
// 1.字面量
var obj = {
name: '张三',
age: 18,
getStudy: function () {
console.log('学习使我快乐')
},
son: {
name: '王五',
age: 18
}
}
console.log(obj);
// in 判断对象里是否有某个属性名 '属性名' in 对象名
// 返回值是true和false true代表有此属性名,false代表无属性名
// 属性名一定要有引号
console.log('name' in obj);
console.log('sex' in obj);//true
</script>
9.遍历对象
// 遍历对象 for ...in 也可以遍历数组 k代表属性名
// 对象由属性名属性值组成 键值对 key value
/* var obj = {
name: '张三',
age: 18,
sex: '男'
}
for (k in obj) {
// console.log(k);
console.log(obj[k]);
} */
// for in 遍历数组时,k代表数组的索引
// var arr = [1, 2, 3, 4, 5]
// for (a in arr) {
// // console.log(a);
// console.log(arr[a]);
// }