Extjs 基礎篇—— Function基礎

這裏主要是JS的基礎知識,也是深刻理解Ext的基礎。
1.參數可變長,注意跟Java仍是有一點區別的。
例:node

1. function getUser(name,age){
2. alert("name: "+name + " age: "+age);
3. }


調用方法:getUser(); // 能夠不傳參數
getUser("cat"); // 能夠只傳遞一個參數
getUser("cat",20); // 傳兩個參數
getUser("cat",20,2,"dog"); // 傳兩個以上的參數
2.不給函數定義形參,直接在函數中使用arguments屬性獲取實際傳遞的參數數組。
例:

1. function getUser(){
2. var args = arguments;
3. alert(args.length);
4. alert(args[0]);
5. }


3.js函數不能重載.由於,JS函數的參數是可變長的,從代碼意義上來講就沒有重載。另外,JS是一種解釋執行的語言,瀏覽器腳本引擎開始載入JS代碼的時候,必須先「掃描」而後纔開始解釋執行。在這個過程當中,有一個重要的操做就是「標識符解析」,要求同一命名空間不容許同名變量的存在,包括函數名。
例:

1. function getUser(){
2. alert("hello!");
3. }
4. function getUser(name){
5. alert("sorry!");
6. }
7. getUser(); // 結果永遠是 sorry!


4.命名空間:Java咱們用package edu.ouc.wy來定義,JS中則須要咱們一層一層的定義。

1. var edu = {};
2. var edu.ouc = {};
3. var edu.ouc.wy = {};


5.JS支持函數嵌套
例:

1. function outerFn(){
2. function innerFn(){
3. alert("innerFn test..");
4. }
5. alert("outerFn test...");
6. }
7. outerFn();  // 結果彈出來兩個窗口


6.既然有了函數嵌套,咱們就有從outerFn外部調用innerFn函數的需求
例:

1. function outerFn(){
2. function innerFn(){
3. alert("innerFn test..");
4. }
5. return innerFn();
6. }
7. var cacheFn = outerFn();
8. cacheFn();


通常來講,「外層」做用域中的代碼是沒法訪問「內層」做用域的。可是經過return一個函數的方式,可讓函數「穿越」做用域的限制,從而讓外層做用域可以「觸摸」到「內層」的函數和變量。
例:

01. var outerName = "cat";
02. function outerFn(){
03. var name = "dog";
04. function innerFn(){
05. alert("outername: "+outerName + " innername: "+name);
06. }
07. return innerFn;
08. }
09. var cacheFn = outerFn();
10. cacheFn(); // 結果爲 outername: cat innername: dog


7.JS中函數既是數據
例:

1. function testFn(){
2. alert("test function..");
3. }
4. alert(testFn); // 顯示的結果和上面這三行是同樣的


例:

1. testFn = function(){
2. alert("test function..");
3. }
4. alert(testFn); // 效果和上一個例子是同樣的


二者的不一樣是:前者直接聲明瞭一個函數,在腳本引擎的解析期間,這個函數就會被建立。
然後者至關因而定義了一個變量,所以只有在腳本真正執行到這一行的時候,函數纔會被構建出來。
8.函數做爲對象的屬性,動態的添加和刪除
例:

1. var obj = {};
2. obj.testFn = function(){
3. alert("test func..");
4. }
5. obj.testFn(); // 括號()的目的是讓testFn這個屬性(函數)執行
6. delete obj.testFn;
7. obj.testFn(); // 報錯


9.函數也是對象,也有本身的類:Function
例1:

1. var testFn = new Function('name','alert(my func...)');
2. testFn();  // 結果 my func...


Function:能夠接受任意多個參數,只有最後一個參數被當作「函數體」。使用new Function()方式建立的函數,是在運行時才建立。而且他的做用域是「頂級做用域」,即window
例:

1. function outerFn(){
2. var name = "cat";
3. var innerFn = new Function("alert(name)");
4. return innerFn;
5. }
6. var cacheFn = outerFn();
7. cacheFn();  // 結果報錯,由於在window做用域中,找不到name變量


例2:

1. var myFn = function(){}
2. myFn.name = "cat";
3. alert(myFn.name); // cat
4. delete myFn.name;
5. alert(myFn.name); // 空


10.三種特殊形式的函數調用:call,apply,()
例:

1. function myFn(){
2. alert(this.name);
3. }
4. myFn.call({name:"cat"});  // 結果爲cat
5. myFn.apply({name:"dog"});  // 結果爲dog


結果很奇怪:兩次this.name竟然不同。這就是JS是動態語言的意義所在,不要被Java思想所束縛。對於JS來講,函數中的this並不必定指向特定的對象,它是可變的。(這句很重要)
call和apply都能執行函數並給this傳遞參數。二者相同點:他們均可以接受兩個參數,第一個參數爲函數中this須要綁定的對象。不一樣點:call的第二個參數是可變長參數,apply的第二個參數是數組。
例:

1. function myFn(a,b){
2. return a+b;
3. }
4. myFn.call({},1,2);
5. myFn.apply({},[1,2]);
6. 例:(function(){
7. alert("my func..");
8. })();


結果這個函數本身就執行了。
11.咱們知道了函數也是對象。也用過了arguments這個原生屬性。JS爲函數對象提供了不少原生的屬性,包括arguments,callee,caller,length,prototype等
例1:

01. function myFn(){
02. var s = "";
03. var len = arguments.length;
04. for(var i=0; i<len; i++){
05. s += arguments[i]; // 注意arguments不是數組,而是對象
06. }
07. alert(s);
08. }
09. myFn(1,2,3,4,5);


例2:

1. function fact(n){ // n的階乘
2. if(n==1){
3. return 1;
4. }else{
5. return n * arguments.callee(n-1);
6. }
7. }


callee在arguments屬性中定義,而且它指向函數本身,能夠用於遞歸調用。
例3:

1. function worker(){
2. alert(worker.caller); // 將會輸出boss函數的代碼,由於沒有給他加(),
3. // 不然將報錯too much recursion
4. }
5. function boss(){
6. worker();
7. }
8. boss();
原文連接:http://extjs.org.cn/node/585
相關文章
相關標籤/搜索