前端面试题整理——作用域和闭包
什么是闭包,闭包的表现形式:
// 作用域应用的特殊情况,有两种表现:
// 函数作为参数被传递
// 函数作为返回值被返回
// 函数作为返回值
function create() {
let a = 100
return function () {
console.log(a)
}
}
let fn = create();
let a = 200;
fn()
//函数作为参数
function print(fn) {
let b = 200;
fn()
}
let b = 100;
function fnb() {
console.log(b)
}
print(fnb)
// 闭包:自由变量的查找,是在函数定义的地方向上级作用域查找,不是在执行的地方。
this的使用场景:
- 作为普通函数调用
- 使用call、apply、bind 调用
- 作为对象方法被调用
- 在class方法中调用
- 箭头函数
重点,无论什么场景调用,this的值都是在函数“执行时”被定义,而不是“定义”函数时定义。
箭头函数的this是取函数上级作用域的this
实际开发中闭包的应用:
隐藏数据,如做一个简单的cache工具,闭包隐藏数据,只提供API。
function createCache() {
const data = {} // 闭包中的数据被隐藏,不被外界访问
return {
set: function (key, val) {
return data[key] = val
},
get: function (key) {
return data[key]
}
}
}
const c = new createCache()
c.set('name','aaa')
console.log(c.get('name'))
写出下列代码的输出:
var x = 2;
var y = {
x: 3,
z: (function (x) {
this.x *= x;
x += 2;
return function (n) {
this.x *= n;
x += 3;
console.log(x)
}
})(x)
}
var m = y.z
m(4);
y.z(5);
console.log(x, y.x);
赞 (0)
