笔记1—this指针、作用域、闭包
Created: August 1, 2022 4:15 PM
本节目标:
- 什么是作用域
- 什么是闭包
- this指向
代码预编译
- 变量声明
- 变量提升,值为undefined
- 非表达式的函数声明进行提升
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)> 对象调用)
- 使用箭头函数,根据外层的规则决定