什么是闭包,闭包的表现形式:
// 作用域应用的特殊情况,有两种表现: // 函数作为参数被传递 // 函数作为返回值被返回 // 函数作为返回值 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);