一.匿名函數javascript
把匿名函數賦值給變量java
var box=function(){ return 'lee'; } alert(box());
經過表達式自我執行閉包
(function(){ return 'lee'; })();
把自我執行後的函數賦值給box;
var box=(function(){
return 'lee'; })();
alert(box);
二. 閉包函數
function box (){ return function(){ return 'lee'; } } alert(box()());
var b=box();
alert(b()); //更靈活一點
1.經過閉包返回局部變量 (使用閉包有一個優勢和缺點 ,就是能夠使局部變量駐留在原來的內存中)this
function box(){ var age=100; return function(){ return age; } } function box(){ var age=100; return function(){ age ++; return age; } } var b=box(); alert(b()); alert(b()); 從而實現累加
2.循環裏面的匿名函數spa
function box(){ var arr=[]; for (var i = 0; i < 5; i++) { arr[i]=(function(num){ return num; })(i); } return arr; } alert(box());
function box(){prototype
var arr=[];
for (var i = 0; i < 5; i++) {
arr[i]=(function(num){ 駐留在做用域
return num;
})(i);
}
return arr;
}code
var box1=box();
for (var i = 0; i < 5; i++) {
alert(box1[i]);
}對象
3.Javascript 沒有塊級做用域(模仿塊級做用域)blog
function box(){ var arr=[]; for (var i = 0; i < 5; i++) { } alert(i); 仍然能夠調用i } box(); 包含自我執行的匿名行數 就能夠使用塊級做用域 私有域控制全局變量 function box(){ (function(){ for (var i = 0; i < 5; i++) { }})(); alert(i); } box(); //包含自我執行的匿名函數就能夠實現塊級做用域 每一個開發者能夠使用本身的變量 不會搞壞全局變量 私有做用域 (function(){ var age=100; alert(age); })();
關於this對象
在閉包中this指向的是Window
var box ={ user:'abc', getUser:function(){
var that=this; return function(){ return this;
return that; } } } alert(box.getUser()()); object window
解決辦法1.對象冒充 alert(box.getUser().call(box)); 不然會發生內存泄漏
解決辦法辦法2 var that=this
私有變量
function(){ var age=100; // 私有變量 } function Box(){ var age=100; function run(){ return "運行中"; } this.publicgo=function(){ //對外可見的公共接口 特權方法 ruturn age+run(); } this.getAge=function(){ return age; } } var box=new Box(); alert(box.getAge());
靜態私有變量
共享不一樣對象的屬性,都能訪問到被其餘對象改變的值
(function(){ var user=' '; Box=function(value){ user=value; }//全局構造函數 Box.prototype.getUser=function(){ return user; } })(); var box=new Box('lll'); alert(box.getUser()); var box2=new Box('kkk'); alert(box.getUser());
單例 就是永遠只實例化一次 其實就是字面量對象聲明方式
var box={ user:'lll'; run:function(){ return " 運行中」; } }