笔记1—this指针、作用域、闭包

22 阅读1分钟

笔记1—this指针、作用域、闭包

Created: August 1, 2022 4:15 PM

本节目标:

  1. 什么是作用域
  2. 什么是闭包
  3. this指向

代码预编译

  1. 变量声明
  2. 变量提升,值为undefined
  3. 非表达式的函数声明进行提升
foo();
var foo = function(){};
// TypeError: foo is not a function// 相当于
var foo;
foo();
foo = function(){};

变量赋、使用

若当前作用域中有a变量,使用;否则在上层作用域中查找

作用域

根据名称查找变量的规则

词法作用域(静态作用域)

定义在词法阶段的作用域(写代码时,变量写在哪里决定的)

函数作用域

属于该函数的所有变量,都可以在整个函数中使用

function foo(a) {
    console.log(a + b);
​
    function bar(c) {
        console.log(a + b + c);
    };
​
    bar(4);
};
​
var b = 2;
foo(2);

上下文(动态作用域)

运行时决定(原因:高阶函数)

什么是闭包

函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,形成闭包

function numGenerator(){
  let num = 1;
  let inlineFunction = () =>{
    console.log(num);
  }
  return inlineFunction();
}
​
var getNum = numGenerator();
​
getNum(); // 1

闭包的使用场景

  • 使用fp时,基本上会有闭包
  • 一个函数的执行,与上下文相关时,基本上会有闭包

this

this指向什么

this的指向,根据上下文,动态决定

  • 简单调用时,this默认指向window / global / undefined (浏览器 / node / 严格模式)
  • 对象调用,绑定在对象上
  • 使用call / apply / bind时,绑定在指定参数上
  • 使用new关键字,绑定到新创建的对象上

(优先级:new > apply/call/bind)> 对象调用)

  • 使用箭头函数,根据外层的规则决定