this指向,作用域和闭包

360 阅读3分钟

好事总会发生在下个转弯。希望你的愿望都能一一实现。

本文纯属个人理解,学习记录知识的笔记,如有错误请指出,我会及时改正谢谢!!

一.this指针

概念:this是当前模块或者函数的运行环境的上下文是一个指针型的变量,普通函数是在调用时才会绑定this

this的绑定规则

1.默认引用:函数独立调用时,前面没有任何修饰,非严格模式指向全局对象(window),严格模式下指向undefined, 注:普通函数作为参数传递,在setTimeOut等中的this也是指向全局对象的

function a() {}
a()

2.隐式绑定:函数调用时有显示的修饰,链式调用情况下遵循就近指向原则

var person = {
  name: '11'
  a: function() {
       console.log('隐式调用')
     }
}
peson.a()

3.显示绑定

call,apply,bind可以修改this指向第一个参数是改变this指向的对象。非严格模式下不传参数,this指向会指到全局对象

call(this, ...args)第二个参数后面的参数都以参数的行书传入

apply(this, [...args])参数以数组形式传递进去

bind会创建一个新的函数,并不会立即执行

4.new 创建一个空对象,创建空对象的__proto__指向原型对象的prototype,以新对象为this执行原有的构造函数,并且返回这个新对象

this绑定优先级是new>显示绑定>隐式绑定>默认绑定

箭头函数

1.箭头函数没有arguments,利用

let nums =(...arguments)=> consol.log(arguments)

2.箭头函数不能作为构造函数构造实例由于箭头函数没有constructor属性

3.箭头函数没有原型对象

4.箭头函数没有自己的this,是由定义的位置决定的this

闭包

闭包只那些能够访问自由变量(函数中使用的既不是函数参数又不是函数变量的变量)的函数

1.柯里化函数:可以避免频繁调用的相同参数的函数可以实现轻松复用

function getArea(width) {
  return height => {
    return width * height
  }
}

2.可以实现私有的方法或者是变量

实现就是模块化的方式现代化的打包就是每个模块代码相互独立

3.匿名的自行执行函数

闭包的作用:创建私有变量,延长生命周期

作用域

作用域决定了代码区块中变量和其他资源的可见性

1.全局作用域:代码中任何地方都能访问到的对象(最外层函数,最外层全局变量, window)

2.函数作用域指声明在函数内部的变量

3.块级作用域(let, const)可以生成在一个函数内部或者代码块内部

特点:1声明变量不会被提升到代码块顶部2.禁止重复声明3.变量只在当前代码块中有效

作用域链

在找一个变量是如果当前作用域找不到会逐级向上查找,当前作用域是指创建函数的作用域