基础知识(作用域和闭包)

一、全局作用域(比如:window)

二、函数作用域(比如:function内声明的变量只能function内使用)

三、块级作用域(比如:if语句内声明的变量只能if内使用)

自由变量:一个变量如果在当前作用域没有定义,但被使用了,就向上级作用域一层一层寻找,直到找到位置,如果到全局作用域都没有找到,则报错xx is no defined,如下:

let a  = 0;
function f1() {
    let a1 = 100;
    function f2() {
        let a2 = 100;
        function f3() {
            let a3 = 200;
            return a + a1 + a2 + a3;
        }
        return f3()
    }
    return f2()
}
f1() //返回400

闭包:所以的自由变量的查找是在函数定义的地方向上查找,不是在函数执行的地方查找,如下:

function create() {
    let a = 100;
    return function () {
        console.log(a)
    }
}

let b = create();
let a = 200;
b() //打印100
let a = 200;
function b() {
    console.log(a)
}

function print() {
    let a = 100;
    b()
}
print() //打印200

this:取值是在函数执行的地方确定的,不是在函数定义的地方

1、作为普通函数

2、使用call apply bind

3、作为对象方法

4、在class方法中调用

5、箭头函数

function a() {
    console.log(this)
}
a() //打印window

a.call({x: 10}) //打印{x: 10}

let b = a.bind({x: 20})
b() //打印{x: 20}

let people = {
    name: '李四',
    hello() {
        //this为当前对象people
        console.log(this)
    },
    wait() {
        setTimeout(function () {
            //由于this是在setTimeout方法中被执行,所以this为window
            console.log(this)
        })
    },
    wait1() {
        setTimeout(() => {
            //箭头函数this取上级作用域的值,this为当前对象people
            console.log(this)
        })
    }
}

class people1{
    constructor(name) {
        this.name = name
    }
    hello() {
       console.log(this) 
    }
}
let lishi = new people1('李四');
lishi.hello(); //打印this为lishi

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值