闭包
- 变量作用域
- 函数可以用来创造作用域 就像一块半透明的玻璃 函数里面可以看到外面的变量 而外面看不到里面的变量
- 在函数中搜索一个变量 如果函数内部没有声明这个变量 那么此次搜索过程会伴随代码的执行环境创建的作用域链往外层逐层搜索 一直搜索到全局对象为止
- 变量生存周期
- 全局变量生存周期是永久的 而函数中声明 var 变量 随函数调用的结束 便会被销毁
- 闭包
- 局部变量所在环境能被外界访问 这个局部变量便有了不销毁的理由
- 局部变量本来是应该在函数退出时被解除引用,但如果局部变量被封闭在闭包所形成的环境中,那么这个局部变量就能一直生存下来
- 把这些变量放在闭包中 和 放在全局作用域中 对内存的影响是一致的 如果将来需要回收这些变量 可以手动将这些变量设为 null
高阶函数
- 至少满足下列条件之一的函数
- 函数可以作为参数被传递
- 函数可以作为返回值输出
函数作为参数
var appendDiv = function (callback) {
for (var i = 0;i < 100; i++) {
var div = document.createElement('div');
div.innerHTML = i;
document.body.appendChild(div);
if (typeof callback === Function) {
callback(div);
}
}
};
appendDiv(function (node) {
node.style.display = 'none';
});
函数作为返回值
var isType = function (type) {
return function (obj) {
return Object.prototype.toString.call(obj) === `[object ${type}]`
}
}
var isString = isType('String')
var isArray = isType('Array')
var isNumber = isType('Number')
console.log(isArray([1, 2, 3]))