闭包
2020 M12 21
如何理解闭包
定义一个函数,函数内部的变量沿着作用域链查找,可以访问非当前作用域下的变量。 这种情况下就是形成了闭包,该函数内引用非当前作用域的变量称为闭包变量。
在v8引擎内部,解析函数的时候会进行一次预检查,当识别到闭包的存在后,会将其引用的变量复制一份到堆内存。
外层函数执行完出栈后,内部变量被释放。 但闭包变量此时引用已经指向堆内存,所以依旧可用。 堆内存空间也不是无限大的,如果积累到一定程度又得不到释放,就会造成内存泄漏。 闭包常见作用是变量私有化和缓存(如webpack同步加载)
在v8引擎内部,解析函数的时候会进行一次预检查,当识别到闭包的存在后,会将其引用的变量复制一份到堆内存。
外层函数执行完出栈后,内部变量被释放。 但闭包变量此时引用已经指向堆内存,所以依旧可用。 堆内存空间也不是无限大的,如果积累到一定程度又得不到释放,就会造成内存泄漏。 闭包常见作用是变量私有化和缓存(如webpack同步加载)
webpack同步加载
(function (modules) {
//模块缓存
var installedModules = {}
//自己实现的__webpack_require__ 取代原生的require
function __webpack_require__(moduleId) {
//命中缓存 直接返回
if (installedModules[moduleId]) {
return installedModules[moduleId].exports
}
//未命中缓存 添加
var module = installedModules[moduleId] = {
id: moduleId,//模块id
load: false,//默认模块没有被加载,
exports: {},//导出的内容
}
//加载对应模块
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
module.load = true//已经加载
return module.exports
}
//加载入口模块
return __webpack_require__('./src/index.js')
})(
{
'./src/index.js': (function (module, exports, __webpack_require__) {
const title = __webpack_require__('./src/title.js')
console.log(title)
}),
'./src/title.js': (function (module, exports,) {
module.exports = 'hello'
})
})