JavaScript基础第五天

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] 是属性值
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春花.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值