前端笔记(JavaSscipt 作用域和闭包)

587 阅读1分钟

题目

- this的不同应用场景,如何取值?

知识点this

- 手写bind函数

msedge_NKfigflZvT.png

- 实际开发中闭包的应用场景,举例说明

  • 隐藏数据
  • 如:做一个简单的cache工具
function createCache(){
    const data= {} //闭包中的数据,被隐藏,不被外界访问
    return {
        set:function (key,val) {
            data[key] = val
        },
        get:function (key){
            return data[key]
        }
    }
}
const c = createCache()
c.set('a',100)
c.get('a')

- 创建10个a标签,点击的时候弹出来对应的序号?

代码

let a
for(let i=0;i <10;i++){
  a = document.createElement('a')
  a.innerHTML = i +'<br/>'
  a.addEventListener('click',function(e){
    e.preventDefault()
    alert(i)
  })
  document.body.appendChild(a)
}

知识点

- 作用域和自由变量

msedge_y0MexEwty3.png

msedge_JIdg3OE6sW.png

- 闭包

自由变量的查找,是在函数定义的地方,想上一级作用域查找,不是在执行的地方

  1. 函数作为返回值
function create() {
    let a = 100
    return function () {
        console.log(a)
    }
}
let fn = create()
let a = 200
fn() // 100
  1. 函数作为参数
function print(fn){
    let a = 200
    fn()
}
let a = 100
function fn() {
    console.log(a)
}
print(fn) //100

- this

this要在执行时才能确认值,定义时无法确认

- 作为普通函数执行

- 使用call apply bind

msedge_IKgcoQeQkP.png

- 作为对象方法被调用

注意!!!wait方法中的this是setTimeout自动执行的所以看做普通函数的执行,不是wait执行的,所以this是window msedge_5f6S4WA9jh.png

- 在class方法中调用

this.name this指正在创建的实例,console.log中的this指zhangsan这个对象 msedge_5qAmei0EF2.png

- 箭头函数

箭头函数指向上级作用域 所以this指向当前对象 msedge_ugAaUawfnv.png