什么是作用域?
- 作用域主要分为 全局作用域、函数作用域、块级作用域
- 全局作用域 定义的变量和函数在作用域的容易位置都可访问
- 函数作用于定义的变量和函数只能在当前函数作用域下使用
- 块级作用域let、const才能生效块级别作用域
- 变量和函数在当前作用于下查询不到会向上级作用域查找, 直到找到或到全局作用域依然没找到位置
什么是闭包?
- 作用域的特殊应用:主要有两种
- 函数作为参数
- 函数作为返回值
上面两个都是概念很少直接问
作用域和闭包综合题
function print(fn){
let a = 100
fn()
}
let a = 200
function fn(){
console.log(a)
}
print(fn) // 打印的是多少
let b = 200
function createPrint(){
let b = 100
return ()=>{
console.log(b)
}
}
createPrint()() // 打印的是多少
两个打印的是200、100
解答: 关键名词: 自由变量
- 自由变量: 自由变量即在当前作用域没定义的变量, 此类变量,执行时会在函数定义的作用域中, 向上级作用域查找
题中a和b都是自由变量, 在定义作用域中,向上查找, 找到的是 200、100
this在不同场景下如何取值?
- this是在函数执行时确定的
- 箭头函数的this取的是父级作用域的this
this是在函数执行时确定的, 自由变量是在定义的时候确定的, 这两个要区分
手写bind函数
Function.prototype.mybind = function () {
let args = Array.from(arguments);
let thisArg = args.shift();
let thisFunc = this;
return function () {
newArgs = args.concat(Array.from(arguments));
return thisFunc.apply(thisArg, newArgs);
}
}