一、作用域
二、变量作用域
1.全局变量 :全局作用域下声明的变量叫做全局变量(代码的任何位置都可以使用)
①在全局作用域下,var声明的变量
②在函数内部不使用var声明的变量
2.局部变量:在局部作用域下声明的变量叫做局部变量 (在函数内部使用)
①函数内部var声明的变量
②函数的形参,实际上也是局部变量
3.区别
全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存。
局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,函数内部使用会被销毁,因此更节省内存空间。
三、作用域链
内部函数访问外部函数的变量采取的是链式查找的方式来决定取哪个值,这种结构我们称为作用域链。(就近原则)
四、预解析
1. Js引擎运行js 分为两步: 预解析 执行代码
预解析,js引擎会把js里面所有var还有function提升到当前作用域的最前面。
执行代码,按照代码书写的顺序从上往下。
2.预解析
变量预解析:把所有的变量声明提升到当前的作用域最前面,不提升赋值操作。
函数预解析:就是把所有函数声明提升到当前的作用域最前面,不调用函数。
(表达式赋值和函数声明有区别的,虽然都是可以声明函数)
案例1:
案例2:
五、对象
1.概念
2.创建对象
①利用字面量创建对象
var obj = {
age: 18,
sex: '男',
sayHi: function() {
console.log('hi~')
}
}
console.log(obj.age);//调用对象属性
注意: 里面的属性或者方法,我们采用键值对的形式。多个属性或者方法,中间用逗号隔开。方法冒号后面跟的是一个匿名函数。
②利用 new Object() 创建对象
var obj = new Object();
obj.age = '18';
obj.sex = '男';
obj.saiHi = function(){
consloe.log('hi');
}
注意: 我们是利用=赋值的方法添加对象的属性和方法。每个属性和方法之间用分号结束。Object的O要大写。
③利用构造函数创建对象
原因:因为我们一次创建一个对象,里面很多的属性和方法是大量相同的。我们只能复制,因此我们可以利用函数的方法重复这些相同的代码,我们把这个函数称为构造函数。构造函数里面封装的不是普通代码,而是对象。
构造函数:就是把我们对象里面一些相同的属性和方法抽象出来 封装到函数里面。
// function 构造函数名() {
// this.属性 = 值;
// this.方法 = function() {}
// }
// new 构造函数名();//调用函数
function Star(uname,sex,age) {
this.uname = uname;
this.age = age;
this.sex = sex;
this.sing = function(sing) {//接收传过来的冰雨
conssole.log(sing);
}
}
var ldh = new Star('刘德华','男',18); //调用函数返回的是一个对象
console.log(ldh.uname);
console.log(ldh.age);
console.log(ldh.sex);
ldh.sing('冰雨');//调用函数就可以传参数
var zxy = new Star('张学友','男',17);//创建一个新的对象
console.log(zxy.uname);
console.log(zxy.age);
console.log(zxy.sex);
zxy.sing('李兰香');
注意:构造函数名字首字母大写
构造函数不需要return
调用构造函数必须使用 new
我们只要new Star()调用函数 就创建一个对象 ldl{}
3.使用对象
调用对象的属性: ① 对象名.属性名 (小点表示的) ②对象名[‘属性名’]
调用对象的方法: 对象名.方法名()
4.变量,属性,函数,方法的区别
变量和属性
共同点: 都是用来存数据的
不同点: 变量需要单独声明并赋值,使用的时候直接写变量名,单独存在
属性在对象里面,不需要声明的,使用“对象.属性”调用
函数和方法
共同点: 都是实现某种功能
不同点: 函数是单独声明,使用 “函数名()” 调用 ,单独存在的
方法在对象里面,使用“对象.方法()”调用
5.构造函数和对象的区别
构造函数:泛指某一大类,它类似于java语言里的类(class)。
对象:是一个具体的事物()特指某一个。
对象实例化:用构造函数创建对象的过程。
6.new关键字的执行过程
new在执行中会做四件事:
1.在内存中创建一个新的空对象
2.让this指向这个新的对象
3.执行构造函数里面的代码,给这个新对象添加属性和方法
4.返回这个新对象(所以构造函数里面不需要return)
7.遍历对象(for in)
var obj = {
age: 18,
sex: '男',
sayHi: function() {
console.log('hi~')
}
}
for (var k in obj) {
console.log(k); //k变量 输出 得到的是属性名 (可以写k也可以写key)
console.log(obj[k]); //obj[k]得到的是属性值
}