什么是閉包?
閉包是指有權(quán)限訪問另一個函數(shù)作用域的變量的函數(shù),創(chuàng)建閉包的常見方式就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù),并返回當前函數(shù)作用域的變量,暴露出變量,讓別人可以訪問。
實例代碼:
function foo(){
var local = 1;
function bar(){
local++;
return local;
}
return bar;
}
var func = foo();
func(); // 2
下面的代碼輸出多少?修改代碼讓 fnArr[i]()
輸出 i
var fnArr = [];
for (var i = 0; i < 10; i++) {
fnArr[i] = function(){
console.log(i);
}
}
console.log( fnArr[3]() ); // 輸出 10
方法一:
var fnArr = [];
for (var i = 0; i < 10; i++) {
(function(j){
fnArr[i] = function(){
console.log(j);
}
})(i)
}
console.log( fnArr[3]() ); // 輸出 3
方法二:
var fnArr = [];
for (var i = 0; i < 10; i++) {
fnArr[i] = (function(){
var j = i;
return function(){
console.log(j);
}
})()
}
console.log( fnArr[7]() ); // 輸出 7
封裝一個汽車對象,可以通過如下方式獲取汽車狀態(tài)
var Car = (function(){
var speed = 0;
function setSpeed(s){
speed = s;
}
function getSpeed(){
return speed;
}
function accelerate(){
return speed += 10;
}
function decelerate(){
return speed = parseInt(speed) > 0 ? speed - 10 : 0;
}
function getStatus(){
return speed = speed > 0 ? 'running' : 'stop';
}
return {
setSpeed: setSpeed,
getSpeed: getSpeed,
accelerate: accelerate,
decelerate: decelerate,
getStatus: getStatus,
speed: 'error'
}
})();
Car.setSpeed(30);
Car.getSpeed(); // 30
Car.accelerate(); // 40
Car.getSpeed(); // 40
Car.decelerate(); // 30
Car.decelerate(); // 20
Car.getSpeed(); // 20
Car.getStatus(); // 'running';
Car.decelerate(); // 0
Car.decelerate(); // 0
Car.getStatus(); // 'stop';
Car.speed; // error