闭包
- 当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏。(可以理解为内存被占用)
闭包的作用
- 实现公有变量 eg:函数累加器
- 可以做缓存(存储结构) eg:eater
- 可以实现封装,属性私有化 eg:Person()
- 模块化开发,防止污染全局变量
function eater() {
var food = "";
var obj = {
eat : function () {
console.log('I am eating ' + food)
food = ""
},
push : function (myFood) {
food = myFood;
}
}
return obj;
}
var eater1 = eater();
eater1.push('banana');
eater1.eat() // 函数eat 和 push 共用一个闭包 food
立即执行函数
立即执行函数,执行完会马上把函数释放,针对初始化功能的函数。
var num = (function abc() {
var a = 1111;
var b = 234;
var c = a + b
return c
}())
// 只有表达式才能被执行符号执行
// (function test() {
// var a = 123
// console.log(a)
// }())
var test = function () {
var a = 123
console.log(a)
}()
// 能被函数符号执行的表达式,函数名字就会被忽略 >> 能被执行符号执行的函数,基本就是立即执行函数
function test() {
var arr = [];
for (var i = 0; i < 10; i++) {
//闭包
// arr[i] = function () {
// console.log(i + " ")
// }
//解决
(function (j) {
//让这个func里的执行上下文变成立即执行函数的AO
arr[j] = function () {
console.log(j + " ")
}
}(i))
}
return arr;
}
var myArr = test();
for (const key in myArr) {
const element = myArr[key];
element();
}
// var a = (1 + 1 , 3) >> 3
var f = (
function f() {
return '1';
},
function g() {
return 2;
}
)();
console.log(typeof f) //会返回2 number
var x = 1;
if (function f() {}) {
//if() 可以把括号里的表达式 转化为布尔值 f就会被销毁
console.log(f) // f is not defined
x += typeof f
//type of undefined >> "undefined"
}
console.log(x) //1undefined String
//考点 隐式类型转换,typeof undefined + 的隐式类型转换