国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

JavaScript閉包實(shí)例講解

2024-05-06 16:04:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
眾所周知,JavaScript沒(méi)有塊級(jí)作用域,只有函數(shù)作用域。那就意味著定義在函數(shù)中的參數(shù)和變量在函數(shù)外部是不可見(jiàn)的,而在一個(gè)函數(shù)內(nèi)部任何位置定義的變量,在該函數(shù)內(nèi)部任何地方都可見(jiàn)

這帶來(lái)的好處是內(nèi)部函數(shù)可以訪問(wèn)定義它們的外部函數(shù)的參數(shù)和變量。

首先,我們來(lái)構(gòu)造一個(gè)簡(jiǎn)單的對(duì)象。

復(fù)制代碼 代碼如下:


var testObj = {
    value: 10,
    add: function(inc){
        this.value += (typeof inc === "number") ? inc : 1;
    }
};

testObj.add();
testObj.value; // 11

testObj.add(2);   
testObj.value; // 13


這樣寫(xiě)就有一個(gè)問(wèn)題,value值不能保證不會(huì)被非法修改,可以按如下的方法進(jìn)行修改。

復(fù)制代碼 代碼如下:


var testObj = (function(){
    var value = 10;
    return {
        add: function(inc){
            value += (typeof inc === "number") ? inc : 1;
        },
        getValue: function(){
            return value;
        }
    };
})();

testObj.add();
testObj.getValue(); // 11

testObj.add(2);
testObj.getValue(); // 13


我們可以通用調(diào)用一個(gè)函數(shù)的形式去初始化testObj,該函數(shù)會(huì)返回一個(gè)對(duì)象字面量,函數(shù)里定義了一個(gè)value變量,該變量對(duì)add和getValue方法總是可用的,但函數(shù)的作用域使得它對(duì)其他的程序來(lái)說(shuō)是不可見(jiàn)的。同時(shí),我們還可以得出一個(gè)結(jié)論,內(nèi)部函數(shù)擁有比它的外部函數(shù)更長(zhǎng)的生命周期。

我們?cè)倮^續(xù)看一個(gè)構(gòu)造函數(shù)調(diào)用的例子。

復(fù)制代碼 代碼如下:


var MyObj = function(str){
    this.status = str;
};

MyObj.prototype.getStatus = function(){
    return this.status;
};

var obj = new MyObj("javascript");
obj.getStatus(); // "javascript"


這樣寫(xiě)并沒(méi)有錯(cuò),但是會(huì)有一點(diǎn)“多此一舉”,為什么要用一個(gè)getStatus方法去訪問(wèn)一個(gè)本可以直接訪問(wèn)到的屬性呢?如果status是私有屬性,那當(dāng)然才有意義。

復(fù)制代碼 代碼如下:


var obj = function(status){
    return {
        getStatus: function(){
            return status;
        }
    };
};

var myObj = obj("javascript");
myObj.getStatus(); // "javascript"


這里當(dāng)我們調(diào)用obj的時(shí)候,它返回包含getStatus方法的一個(gè)新對(duì)象,該對(duì)象的一個(gè)引用保存在myObj中,即使obj已經(jīng)返回了,但getStatus方法仍然享有訪問(wèn)obj對(duì)象的status屬性的特權(quán)。getStatus方法并不是訪問(wèn)該參數(shù)的一個(gè)副本,它訪問(wèn)的就是該參數(shù)本身。這是可能的,因?yàn)樵摵瘮?shù)可以訪問(wèn)它被創(chuàng)建時(shí)所處的上下文環(huán)境,這被稱(chēng)為閉包。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 锡林浩特市| 鄂伦春自治旗| 阜平县| 靖安县| 筠连县| 江源县| 贺州市| 荥经县| 萨迦县| 建水县| 张家界市| 灌南县| 图片| 巴塘县| 安泽县| 吴忠市| 分宜县| 大化| 内江市| 滁州市| 达孜县| 科技| 封丘县| 弥勒县| 延边| 克什克腾旗| 玉溪市| 科技| 乐亭县| 浙江省| 博爱县| 信丰县| 蛟河市| 洪泽县| 孟连| 天台县| 北京市| 鄢陵县| 紫阳县| 黄冈市| 藁城市|