JavaScript函數部分補充

以前說了函數的調用,如今再來講說函數的另外幾個重要概念:
閉包:函數內部能夠訪問函數外部的變量,函數外部不能訪問函數外部的變量。爲了打破這種「不公平」,就產生了閉包。
首先看一個簡單的例子:
var fun1= function () {
            var m=10;
            var inFun= function () {
                return m;
            }
            return inFun;
        }
        var f=fun1();
        alert(f());
這就是一個最基本的閉包例子了,在這個例子中,閉包能夠理解成爲是java中的get函數,用來獲得對象內部的屬性的。
上面例子的另外一種變體是這樣的,可是我我的不是很喜歡這麼用。    
   var fun1= function () {
            var m=10;
            var inFun= function () {
                alert(m);
            }
            inFun();
        }
        fun1();  
由於容易寫成這樣子:
        var fun1= function () {
            var m=10;
            var inFun= function () {
                return m;
            }
            inFun();
        }
        alert(fun1());
可是,閉包除了上面例子的做用外,還有另外的功能,有時候咱們的要求老是會不少,除了訪問外,咱們還但願對函數內部的變量進行修改,再看下面的例子。
        var fun1= function () {
            var m=10;
            var change= function (n) {
                return m+=n;
            }
            return change;
        }
        var ch=fun1();//關鍵就在這裏,調用fun1後函數已經結束,按照常理函數中的變量會隨着函數的結束而不可訪問
        alert(ch(1));//可是在這裏輸出的是11
這就是閉包的另外一個做用,當調用原函數結束後還能夠對函數內部的變量進行訪問。由於函數內部的chage()被一個全局變量引用着,所以m並不會退出內存。
說完這個以後,不少還會再說內部函數的this做用域的問題,由於以前在函數的調用裏面已經講了,而且我的以爲這與函數的閉包並無多大關係,只是閉包也是內部函數而已。所以這裏就再也不說那點了。
回調:讓人受不了的就是js的回調了,多層的嵌套會讓代碼徹底看不清楚。不知回調仍是「毀掉」,可是聽說node.js中的異步回調函數正是其大放異彩的地方。有人說異步的代碼是反人類的,可是同步的作事是否是也是反人類的。我想可能沒人能受得了先吃飯再看電視而不是一邊吃飯一邊看電視吧。
模塊:有時候有沒有想過寫js代碼和java代碼同樣,可是js中沒有類一說,做爲補充提供了與之相似的模塊化。
其實上面的閉包就有點像模塊化了。下面咱們看一個更像java中類的模塊化代碼。
        var model1=(function(){
            var m=10;
            var fun1= function () {
                alert("我是fun1")
            }
            var fun2= function () {
                alert("我是fun2")
            }
            return {
                fun1:fun1,
                fun2:fun2
            }
        })();
        //在model1外部進行調用
        model1.fun1();
動態的爲model1增長方法:
 var model1=(function(){
            var m=10;
            var fun1= function () {
                alert("我是fun1")
            }
            var fun2= function () {
                alert("我是fun2")
            }
            return {
                fun1:fun1,
                fun2:fun2
            }
        })();
        //爲model1增長方法fun3
        var model2= (function (mod) {
            mod.fun3=function(){
                alert("我是fun3")
            }
        })(model1);
        model1.fun3();
相關文章
相關標籤/搜索