1,函數聲明function functionName(arg0,agr1,arg2){} 在firefox,safari,chrome中經過name屬性返回函數名
2,函數聲明提高,能夠把函數聲明放在調用它的語句後面
3,函數表達式:var functionName = function(arg0,arg1,arg2){};不被提高,必須放在調用它的語句前面
一,遞歸
1,argument.callee是一個指向正在執行的函數的指針,在函數名改變的狀況下,使用argument.calleee代替函數名實現函數的遞歸調用
二,閉包chrome
function f1(){ var n = 10000; function f2(){ 訪問到n能夠操做n; } return f2; }
1,閉包與變量閉包
function f1(){ var n = 10000; function f2(){ 訪問到n能夠操做n; } return f2; }
2,關於this對象
全局環境中,this等於window,當函數被做爲方法是用時,this指向這個對象函數
var name = "the window"; var object = { name:"my Object", getNameFunc:function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 返回the window
將外部函數的this對象保存在閉包可以訪問到的變量裏
var name = "the window";this
var object = { name:"my Object", getNameFunc:function(){ var that = this; return function(){ return that.name; } }; }; alert(object.getNameFunc()()); 返回my object
使用argument有一樣的問題,因此要想訪問做用域中的argument對象,必須將該對象的引用保存在另個閉包可以訪問到的變量中
3,內存泄露
閉包會引用包含函數的整個活動對象,最好在外部函數中定義閉包能直接訪問的變量,閉包結束後釋放變量,減小引用數
函數返回了一個閉包時,這個函數的做用域將會一直在內存中保存到閉包不存在爲止
三,模仿塊級做用域
1,for循環語句中定義的變量,能夠在for循環外部訪問到
2,js不會響應是否屢次聲明瞭同一個變量,忽略後面的聲明可是不會忽略後續中的初始化
3,用做塊級做用域的(私有做用域)的匿名函數的語法:(function(){//這裏是塊級做用域})();
4,函數聲明後面不能加(),函數表達式後面能夠加();
5,匿名函數中定義的任何變量在結束後都會消失
6,()();能夠減小閉包占用的內存問題,只要函數執行完畢,就當即銷燬其做用域鏈了
四,私有變量
有權訪問私有變量和私有函數的共有方法稱爲特權方法spa
function(){ //私有變量和私有函數 var privateFunction = 10; function privateFunction(){ return false; } //特權方法 this.publicMethod = function(){ privateVariable++; return privateFunction(); } }
1,靜態私有變量firefox
(function(){ //私有變量和私有函數 var privateVariable = 10; function PrivateFunction(){return false;} //構造函數(使用函數表達式方式實現) MyObject = function(){}; //共有特權方法,在構造函數原型上實現 MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();}; })();
2,模塊模式
1)建立單例對象,以對象字面量的方式來建立prototype
(function(){ //私有變量和私有函數 var privateVariable = 10; function PrivateFunction(){return false;} //構造函數(使用函數表達式方式實現) MyObject = function(){}; //共有特權方法,在構造函數原型上實現 MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();}; })();
2)模塊模式爲單例添加私有變量和特權方法使其獲得加強指針
var singleton = function(){ //私有變量和私有函數 var privateVariable = 10; function privateFunction(){return false;} //特權共有方法 return{ publicProperty:true, publicMethod:function(){ privateVariable ++; return privateFunction(); } }; }();
3,加強的模塊模式
指定單例必須是某種類型的實例時code
var singleton = function(){ //私有函數和私有變量 var privateVariable = 10; function privateFunction(){return false;} //建立特定類型的對象實例 var object = new CustomType(); //添加特權共有屬性和方法 object.publicProperty = true; object.publicMethod = function(privateVariable ++;return privateFunction();){}; //返回這個對象 return object; }();