匿名函數
<script type="text/javascript">
//function(){}//會報錯
var fun = function(){};//將匿名函數賦值給變量
(function(){})();//匿名函數自執行
function(){
return function(){};//函數裏的匿名函數
}
</script>
閉包
<script type="text/javascript">
//通過閉包可以返回局部變量
function box() {
var user = 'Lee';
return function () { //通過匿名函數返回box()局部變量
return user;
};
}
console.log(box()()); //通過box()()來直接調用匿名函數返回值
var b = box();
console.log(b()); //另一種調用匿名函數返回值
//通過閉包可以實現局部變量的累加
function box() {
var age = 100;
return function () {
age ++;
return age;
}
}
var b = box(); //獲得函數
console.log(b()); //調用匿名函數
console.log(b()); //第二次調用匿名函數,實現累加
</script>
循環裏的閉包
<script type="text/javascript">
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
return arr;
}
var b = box(); //得到函數數組
console.log(b.length); //得到函數集合長度
for (var i = 0; i < b.length; i++) {
console.log(b[i]()); //輸出每個函數的值,都是最後一個值
}
</script>
循環裏的閉包--修改
<script type="text/javascript">
function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = (function (num) {
return function () { //返回函數
return num;
}
})(i);
/*
//相當於:
arr[i] = (function () {
var num = i;//定義一個局部變量
return function () {
return num;
}
})();
*/
}
return arr;
}
var b = box(); //得到函數數組
for (var i = 0; i < b.length; i++) {
console.log(b[i]()); //0,1,2,3,4
}
</script>
通過在box作用域裏新建塊級作用域來是每個返回函數保存的變量都不一樣閉包中的this對象
<script type="text/javascript">
var user = 'The Window';
var obj = {
user : 'The Object',
getUserFunction : function () {
return function () { //閉包不屬於obj,裏面的this指向window
return this.user;
};
}
};
console.log(obj.getUserFunction()()); //The window
//可以強制指向某個對象
console.log(obj.getUserFunction().call(obj)); //The Object
/*
//也可以從上一個作用域中得到對象
getUserFunction : function () {
var that = this; //從對象的方法裏得對象
return function () {
return that.user;
};
}
*/
</script>
模仿塊級作用域
<script type="text/javascript">
//使用塊級作用域(私有作用域)改寫
function box(count) {
(function () {
for (var i = 0; i<count; i++) {}
})();
console.log(i); //報錯,無法訪問
}
box(2);
</script>
私有變量
<script type="text/javascript">
function Box() {
var age = 100; //私有變量
function run() { //私有函數
return '運行中...';
}
this.get = function () { //對外公共的特權方法,閉包(函數訪問了不屬於對象作用域的age和run方法)
return age + run();
};
}
var box = new Box();
console.log(box.get());
</script>
靜態私有變量
<script type="text/javascript">
(function () {
var age = 100;//靜態私有變量
function run() {
return '運行中...';
}
Box = function () {}; //構造方法,沒有使用var,全局函數
Box.prototype.go = function () { //原型方法
return age + run();
};
})();
var box = new Box();
console.log(box.go());
</script>
模塊模式
<script type="text/javascript">
var box = function () { //box是一個模塊
var age = 100;
function run() {
return '運行中...';
}
return { //直接返回對象
go : function () {
return age + run();
}
};
}();
</script>