1.闭包
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
直观的说就是形成一个不销毁的栈环境。
js闭包典型的运用场景就是计算器困境:
function add() {
var counter = 0;
return counter += 1;
}
console.log(add())
console.log(add())
console.log(add())
如上面的代码本意是输出3,最终输出的确都是1,而如果把counter定义在add函数的父作用域,则会导致任何脚本都能修改counter的值而扰乱计算结果
因此,我们可以使用自我调用函数形成的私有作用域,来保存变量
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
console.log(add())
console.log(add())
console.log(add())
以上代码执行结果为1,2,3 从而解决了这个问题
###2.回调
回调函数原理:一个函数被作为参数传递给另一个函数(在这里我们把另一个函数叫做“otherFunction”),回调函数在otherFunction中被调用。
回调函数并不会马上被执行。它会在包含它的函数内的某个特定时间点被“回调”
回调函数典型的运行场景就是获取异步函数的返回值
比如:
function getSomething() {
var r = 0;
setTimeout(function() {
r = 2;
}, 10);
return r;
}
function compute() {
var x = getSomething();
console.log(x * 2);
return x * 2
}
compute();
上面的代码执行结果不是4,是0,这是因为异步方法在同步方法之后执行
想到得到异步方法的返回值就可以用到回调
function getSomething(cb) {
var r = 0;
setTimeout(function() {
r = 2;
cb(r);
}, 10);
}
function compute(x) {
console.log(x * 2);
return x * 2
}
getSomething(compute);