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