什么是闭包?
闭包是指有权限访问另一个函数作用域的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,并返回当前函数作用域的变量,暴露出变量,让别人可以访问。
实例代码:
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
封装一个汽车对象,可以通过如下方式获取汽车状态
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