Tips: 內容爲知識梳理javascript
定義函數有兩種方式:函數
function name(arg0,arg1,arg2){
//代碼
}
複製代碼
函數名.name
能夠訪問函數名var name =function(arg0,arg1,arg2){
//代碼
};
複製代碼
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});
複製代碼
上面函數名爲f,賦值給了factorial。ui
function ceee(){
var sum=new Array();
for(i=0;i<10;i++){
sum[i]=function(){
return i;
};
}
retuen sum;
}
複製代碼
此函數返回的數組都是10,由於閉包做用域鏈保存着包含函數的活動對象,它們引用的都是同一個i,當包含函數返回後,i等於10,因此數組都爲10var name="abc";
var ob=function(){
name:"fff",
getname:function(){
return function(){
return this.name;
};
}
};
複製代碼
上面代碼的this指向window,由於對於最裏面的函數的做用域鏈,它在搜索this時,逐層往上搜索,由於本身的活動對象中存在this,而這個this是指向全局的,因此不會再往上搜索包含函數的this(不知道這樣說你理解沒有,反正我是理解了),修改方法是把this先保存在一個變量中,再在閉包調用這個變量,此時的this就是指向包含函數javascript無塊級做用域概念,即在塊語句中定義的變量其實也是存在於包含他的外部函數的做用域鏈中,而不是像java和c語言同樣在塊語句結束後就被銷燬。this
(function(){
//這裏是塊級做用域
})();
複製代碼
匿名函數即函數表達式後面能夠跟圓括號表示當即調用,而函數聲明即有名函數後面不能夠跟圓括號function mobj(){
var num=1;//私有變量
this.meth = function(){
return num;
};//特權方法
}
複製代碼
這樣就能夠在外部經過訪問meth這個函數屬性來訪問私有變量用原型模式和匿名函數將私有變量變爲全部實例共享,具體以下spa
(function (){
var name="abd";//私有變量
mbu = function(){};
mbu.prototype.publicmetho =function(){
return name;
};//在原型對象中設置屬性
})();
複製代碼
上面代碼首先是建立一個私有做用域,而後定義一個私有變量,再不使用var定義一個全局變量mbu,再對mbu的原型對象添加屬性publicmethoprototype
爲單例建立私有變量和特權方法,語法以下:
var single = function(){
var pria =20;//私有變量
return {
publicee :10;
publicmetho: function(){
return pria;
}//返回一個以字面量建立的對象
};
}();
複製代碼
上面代碼返回了一個以字面量建立的對象,這個對象能夠訪問私有變量
加強模塊模式即在返回對象前加入對其加強的代碼,這種模式適合那些單例必須是某種類型的實例,同時還必須添加某些屬性或方法對其加強的狀況。