Javascript讀書筆記:函數定義和函數調用

來源:互聯網
上載者:User

定義函數 使用function關鍵字來定義函數,分為兩種形式: 聲明式函數定義; function add(m,n) {    alert(m+n); }這種方式等同於構造一個Function類的執行個體的方式:var add = new Function("m", "n", "alert(m+n);");Function類構造方法的最後一個參數為函數體:"alert(m+n);",前面的都是函數的形參,參數必須是字串形式的:"m","n"。函數運算式;複製代碼 1 //將一個匿名函數賦值給變數add 2 var add = function(m, n) { 3     alert(m + n); 4 }; 5 add(1, 2);//3 6  7 //函數運算式作為參數傳遞給其他函數 8 var arr = [1, 3, 4, 2]; 9 arr = arr.sort(function(a, b) {10     return a - b;11 });12 alert(arr);//1,2,3,413 14 //定義後立即調用15 alert( function(m, n) {16     return m + n;17 }(1, 2));18 19 //函數運算式也可以定義名稱(如用於遞迴)20 var f=function fact(x){21     if(x<1) {22         return 1;23     }else{24         return x*fact(x-1);25     }26 };複製代碼聲明式函數定義和函數運算式的一點區別 聲明式函數定義語句屬於頂級範圍範圍,函數調用語句可寫在函式宣告語句之前: add(1, 2);//3function add(m, n) {    alert(m + n);}函數運算式定義的函數在定義之前無法調用: //TypeError: add is not a functionadd(1, 2);var add = function(m, n) {    alert(m + n);};函數的傳回值 Javascript中的函數不需要聲明傳回型別,使用return關鍵字返回一個值。若函數不包含return語句,或者直接使用"return;",則函數的傳回值為undefined。 嵌套函數 函數可以嵌套在其他的函數裡面,內層函數可以訪問外層函數的參數和變數: 複製代碼function add(m, n) {     function d(x) {        return x * 2;    }     return d(m) + d(n);} alert(add(1, 2));//6複製代碼調用函數 函數體代碼在函數被調用時才會執行。Javascript函數有4中調用方式: 普通的函數調用方法調用建構函式調用通過 call() 和 apply() 間接調用普通的函數調用 最常用的函數調用方式,如: alert("hello"); var result = add(1, 2);方法調用 所謂方法就是將一個函數賦給一個對象的屬性: 複製代碼 1 //定義一個函數 2 function hello(name) { 3     alert('hello,' + name); 4 }; 5 var user = {}; 6  7 //賦值給user的sayHi屬性 8 user.sayHi = hello; 9 10 //方法調用11 user.sayHi('張三');複製代碼普通的函數調用和方法調用的一個區別:在"普通的函數調用"方式中,函數的調用上下文(this的值),為全域對象(非strict 模式)或者undefined(strict 模式)。而在"方法調用"方式中,this指向當前對象。利用這一特性,我們可以在方法不需要明確的傳回值時,直接返回this,從而實現"方法鏈"。如jquery中常見的: $('#btn_edit').css({color:red}).show();嵌套函數中的this:嵌套函數中,內層函數不會繼承外層函數的this,即當內層函數作為方法調用時,內層函數的this指向當前調用對象;當內層函數作為函數調用時,this的值為全域對象(非strict 模式)或者undefined(strict 模式)。怎樣在內層函數中訪問外層函數的this呢?通常將this儲存在一個局部變數中,通過變數來訪問: 複製代碼 1 var obj = { 2     f : function() { 3         var self = this; 4         console.log(this === obj);//true,this指向當前對象 5  6         f1(); 7  8         function f1() { 9             console.log(this === obj);//false,this為全域對象或者unde10             console.log(self === obj);//true,self指向外層this,即當前對象11         }12     }13 };複製代碼建構函式調用 當使用new關鍵字建立一個對象時,即調用了建構函式。建構函式若沒有形參,可以省略圓括弧: var obj = new Object();//等價於var obj = new Object;調用建構函式,建立了一個新對象,這個新對象會成為該建構函式的調用上下文(this的值): function User(name) {    this.name=name;    console.debug(this);} var user = new User('張三');  call() 和 apply() 間接調用 Javascript中函數也是對象,也擁有方法。其中 call() 和 apply() 可以用來間接調用函數。call() 的第一個參數用來指定調用上下文(即this的值),後面的參數是傳入調用函數的實參。 複製代碼 1 var name = 'A'; 2 var user = { 3     name : 'B' 4 }; 5  6 function showName() { 7     alert(this.name); 8 } 9 10 showName();//A,this為全域對象11 showName.call(user);//B,this為user對象複製代碼apply() 和 call() 類似,區別在於,後面的實參需要以數組的形式傳遞(可將當前函數的arguments數組直接傳入)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.