学习咯-this指针/闭包/作用域

62 阅读2分钟

仅仅是记录一个菜鸟的学习历程哦,不美观,无格式哈哈哈哈哈。

一、作用域

1、作用域:一个变量的有效使用范围(函数可以框定一个作用域);

(1、变量提升,将变量声明提升到它所在的作用域的最开始部分,注意提升的是声明而非赋值;

前提:a、只在当前作用域内;b、const、let不能,只能使用var;

(2、函数提升,代码顺序上能先使用再声明,提升的是函数本身,可直接使用。

前提:a、只在当前作用域内;b、只有函数声明形式才存在函数提升

2、作用域链:多个作用域之间的传递(通俗地讲,当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。);

二、上下文(context)this

1、this:表示当前执行代码的环境对象,是在执行时动态读取上下文决定的,而不是创建时。函数直接调用中,this指向的是window(谁调用,指向谁)。

(1、隐式绑定,this指代调用堆栈的上一级 => 对象、数组等引用关系逻辑

function fn () {
  console.log('隐式绑定', this.a)
}
const obj = {
  a: 1,
  fn
}

obj.fn = fn
obj.fn()
// 1

(2 显示绑定(bind | apply | call)

function foo() {
    console.log('函数内部', this)
}
foo()
foo.call({a: 1})
foo.apply({a: 1})
const bindFoo = foo.bind({a: 1})
bindFoo()

三、闭包

闭包:内部函数包含外部变量。

嵌套的内部函数与外部发生连接(内部函数引用外部变量),形成闭包。

闭包的运用:1、实现私有变量;2、封装模块

要么不用,用完一定要销毁!!

Q1:变量、函数提升优先级? A:函数提升优先级高于变量提升,且不会被同名变量所覆盖,但是会被变量赋值后覆盖

Q2:

const foo = {
    bar: 10,
    fn: function () {
        console.log(this.bar)
        console.log(this)
    }
}
let fn1 = foo.fn
fn1()

A: undefined window(obj)

Q3: call 、 apply 、 bind 的区别 A: 1、call vs apply:传参不同 fn.call(thisObj, arg1, arg2, arg3...), arg1、arg2、arg3... 是依次作为fn的入参。fn.apply(thisObj, [arg1, arg2, arg3]) 2、bind返回不同

q4: 手写bind的原理 a: 关键点有2:1、fn里面的this指向,就是调用者本身。2、使用函数内置对象arguments(类数组对象,有length,但不能使用Array的方法,可用[...arguments]解构转成Array),下标0的属性,即为要绑的上下文对象本身。