七
函式法一
函式宣告
function functionname(arg0,arg1,arg2)
alert(functionname.name);//functionname,只在firefox,safri,chrome和opero有效
函式宣告提公升,在執行**前先讀取函式宣告
sayhi();
function sayhi()
//不會丟擲錯誤,在**執行前會先讀取函式宣告
法二使用建立函式的方式使用函式表示式
var functionname=function(arg0,arg1,arg2)
//函式表示式和其他表示式一樣,在使用前必須賦值。
sayhi();//錯誤,函式不存在
var sayhi=function();
遞迴;遞迴函式是在乙個函式通過名字呼叫自身的情況下構成的
function factorial(num)else
}使用argument.callee是乙個指向正在執行的函式的指標,因此可以用他來實現對函式的遞迴呼叫
function factorial(num)else
}在嚴格模式下使用這種方式進行遞迴呼叫最為規範
var factorial=(function f(num)else
});//即便把函式值賦給另乙個變數,函式的名字f仍然有效。
閉包閉包是指有許可權訪問另乙個函式作用域的變數的函式,
建立閉包的常見方式就是在乙個函式內部建立另乙個函式,
就是內部函式,
function createfunctions();
}return result;
}//每個函式都會返回10,因為每個函式的作用域鏈中
都儲存著createfunctions()函式的活動物件。所以他們引用的都是同乙個變數i.
當createfunctions()函式返回後,變數i的值是10;
//使用匿名函式強制讓閉包的行為符合預期
function createfunctions();
}(i);
return result;
}//返回0,1,2,3,4,5,6,7,8,9
關於this物件;
this物件是在基於函式的執行環境繫結的,在全域性函式中,this等於window,
而當函式被作為某個物件的方法呼叫時,
this等於那個物件。匿名函式的執行具有全域性性,因此其this物件通常指向window.
例如var name="the window";
var object=;}};
alert(object.getnamefunc()());//"the window"
下例中把this物件賦給了that變數。that變數按照作用域鏈便會返回my object
var name="the window";
var object=;}};
alert(object.getnamefunc()());//my object;
在幾種特殊的情況下,this的只會意外的改變
var name="the window";
var object=;
object.getname{};//"my object"
{}//"my object"
記憶體洩漏
function assignhandler();
element=null;
}//如果閉包的作用域鏈中儲存著乙個html元素,則意味著該元素無法被銷毀。(此**中已銷毀)
//閉包會引用包含函式的整個活動物件,其中包含著
element.即使閉包不直接引用element,包含函式的活動物件中
也仍然會儲存乙個引用。因此,有必要把element變數設定為null.
這樣就能解除對dom物件的引用,確保正常**其占用的記憶體。
模仿塊級作用域
function outpnumbers(count)){};
法二var somef=function();
somef();
法三(function())();
臨時需要一些變數可以使用私有作用域,例如
function outpnumbers(count)
//sum num1,num2都是私有變數。
有權訪問私有變數和私有函式的工有方法稱為特權方法。
法一:在建構函式中定義特權方法
function myobject()
//特權方法
this.pm=function();
}用私有和特權成員可以隱藏那些不應該被直接修改的資料
function per(name);
this.setname=function(value);
}var per=new per("nicholas");
alert(per.getname());//"nicholas"
person.setname("greg");
alert(per.getname());//"greg"
//建構函式缺點:每個例項都會建立同樣一組新方法
靜態私有變數
1.函式宣告只能建立區域性函式。
通過在私有作用域中定義私有變數或函式,建立特權方法
使用函式表示式的方式
(function()
//建構函式
myobject=function();
//公有/特權方法
myobject.prototype.publicmethod=founction();
})();
//初始化未經宣告的變數,總是會建立乙個全域性變數
故myobject就成了乙個全域性變數。能夠在私有作用域外被
訪問到。
(function();
person.prototype.getname=function();
person.prototype.setname=function(value);
})();
var person1=new person("nicholas");
alert(person1.getname());//"nicholas"
person1.setname("greg");
alert(person1.getname());//"greg"
var person2=new person("michael");
alert(person1.getname());//"michael"
alert(person2.getname());//"michael"
模組模式
為單例建立私有變數和特權方法
var singleton=function()
//特權/公有方法和屬性
return
};}();
//將乙個物件字面量作為函式的值返回,返回的物件字面量中只包含可以公開的的屬性和方法。因此他的公有方法有權訪問私有變數和函式,由於這個物件是在匿名函式內部定義的,
從本質上來講,這個物件字面量定義的是單例的公共介面。
//即:如果必須建立乙個物件並以某些資料對其初始化,同時還要公開一些
能夠訪問這些私有資料的方法。
增強的模組模式
//增強的模組模式適合那些單例必須是某種型別的例項,同時還必須
新增某些屬性和(或)方法對其加入以增強的情況。
var singleton=function()
//建立物件
var object=new customtype();
//新增特權/公有屬性和方法
object.publicproperty=true;
object.pubicmethod=function();
//返回這個物件
return object;
}();
JavaScript高階程式設計
ecmascript有5種基本型別資料 另外還有一種複雜的資料型別 typeof就是用來檢測變數的資料型別的,typeof可能會返回以下值 typeof操作符在檢測引用型別的值時,總是會返回object,所以用處不大。instanceof用來檢測物件型別的,返回值是 true false。例如 pe...
JavaScript高階程式設計 this
在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了 因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。所謂建構函式就是用來new物件的函式。其實嚴格來說,所有的函式都可以new乙個物件,但是有些函式的定義是為了new乙個物件...
javascript 高階程式設計 二
這裡我們直接進入主題 在js剛剛開始的時候,必須面臨乙個問題,那就是如何使的js的載入和執行不會影響web核心語言html的展示效果,和html和諧共存。在這個背景下 2 xhtml中的應用 在html中如果字串,那麼html就會認為js指令碼已經結束所以會產生乙個錯誤用一下 來替換 來替換aler...