1作用域
简单来说,作用域就是在代码中遇到的名字,将名字的可用性的代码限定作用范围就是这个名字的作用域。
在JavaScript中(ES6前)作用域有两种:全局作用域和局部作用域。
//全局作用域:在整个script标签内或者js文件内
let num = 10 //这是一个全局变量
// console.log(num)
function fun(){
console.log(num)
}
fun()
//局部作用域:函数作用域,在函数内部的就是局部作用域
function fn(){
let num = 20
console.log(num)
}
fn()
console.log(num)
2.变量的作用域
变量的作用域:根据作用域不同,变量分为全局变量和局部变量
全局变量:在全局作用域下声明的变量,在全局下都可以使用。
注意:函数里没有声明直接赋值的变量也属于全局变量。
let num = 10
console.log(num)
function fn(){
num = 20
console.log(num)
}
fn()
局部变量:函数里定义的变量,注意:函数的形参也属于局部变量。
function fn1(arg){
let num1 = 10
num2 = 20
console.log(num1)
console.log(num2)
}
fn1()
总结:
1、从效率上考虑,局部优于全局
2、从内存空间考虑,局部与函数有关,函数结束,局部变量也消失
3、当一个变量被多个函数反复使用,建议使用全局变量。
3.块级作用域
块级作用域在ES6之前是没有的,{}内的let变量包括if{}、for{},只能在块级作用域里访问,不能跨块访问,也不能跨函数访问。
function fn(){
if(5 < 7){
let num = 10
}
console.log(num)
}
fn()
4.作用域链
内部函数访问外部函数的变量,采用链式查找的方式来决定取哪一个值,这种结构称为作用域链。
//就近原则
let num = 10
function fn(){//外部函数
let num = 20
function fun(){//内部函数
console.log(num)
}
fun()
}
fn()
5.预解析
浏览器有一个js的解析器,解析器工作分为2步,预解析与代码执行。
预解析:在代码执行前将变量,函数加载内存。
console.log(num)
let num = 10
总结:
1、变量预解析:把变量声明提升到当前作用域最前面,不提升赋值
2、函数预解析:把函数声明提升到当前作用域最前面,不调用函数。
6.对象
对象是一组无序的相关属性和方法的集合,所有的事物都是对象。
属性:事物的特征,在对象中用属性来表示(常用名词)
方法:事物的行为,在对象中用方法来表示(常用动词)
6.1利用对象字面量创建对象
let obj = {}是一个空的对象
let person = {
uname : '张三',
age : 18,
sex : '男',
xiWan = function(){
console.log('洗碗')
}
}
属性与方法采用键值对的形式
多个属性或者方法之间用,隔开
方法冒号后跟匿名函数
console.log(person)
//使用对象
//调用属性,对象名.属性名
console.log(person.uname)
//对象名[‘属性名’]
console.log(person[‘age’])
//调用方法,对象名.方法名
person.xiWan
变量,属性,函数,方法的区别
变量与属性的相同点:存取数据
不同点:变量需要单独声明,并赋值,使用的时候直接写变量名,单独存在。
属性在对象里不需要声明,使用的时候必须是对象名.属性名
函数与方法的相同点:都是实现某个功能
不同点:函数需要单独声明,可以直接函数名()调用,单独存在
方法是在对象里,调用方式 对象名.方法名
6.3利用new Object创建对象
var sec = new Object();
例如:
let obj = new Object();
obj.uname = '关小羽'
obj.age = 17
obj.sex = '男'
obj.shuaDaDao = function(){
console.log('耍大刀')
}
console.log(obj.uname)
console.log(obj['age'])
obj.shuaDaDao()
注意:Object():第一个字母要大写
new Object():需要new关键字
格式:对象.属性 = 值
6.4利用构造函数创建对象
//1、定义构造函数
function Fn(uname,age,sex){
this.uname = uname
this.age = age
this.sex = sex
this.sellPig = function(){
console.log('宰猪')
}
}
//2、创建对象
let obj = new Fn('张小飞',16,'男')
console.log(obj.uname)
console.log(obj['age'])
obj.sellPig()
注意:构造函数约定首字母要大写
函数内的属性和方法前面需要加this,表示当前对象的属性和方法。
构造函数中不需要return返回结果
当我们创建对象的时候,必须用new来调用构造函数。
6.5遍历对象
for…in语句用于对数组或者对象的属性进行循环操作。
for(变量 in 对象名字){
//执行代码
}
语法中的变量是自定义的,它需要符合命名规范,通常我们会将这个变量写为 k 或者 key。
x for (var k in obj) {
console.log(k); // 这里的 k 是属性名
console.log(obj[k]); // 这里的 obj[k] 是属性值
}