官术网_书友最值得收藏!

7.4 內(nèi)部函數(shù)中的this

我們先來看一個(gè)例子。

    var v = 1;
    function Program(){
        var v = 2;
        this.v = 3;
    }
    Program.prototype.logV = function () {
        function innerLog(){
            console.log(this.v);
        }
        innerLog();
    }
    var pro = new Program();
    pro.logV();

大家覺得上述代碼會(huì)打印出什么呢?可能有的讀者覺得很簡(jiǎn)單,既然是pro對(duì)象調(diào)用的,當(dāng)然會(huì)打印出pro對(duì)象中v的值3。但是,實(shí)際上1才是正確答案。在這個(gè)例子中,需要注意實(shí)際的打印操作并不是在logV方法中執(zhí)行的,而是在logV中調(diào)用它的內(nèi)部方法innerLog來完成的,因此這里的this應(yīng)該指向innerLog方法前的對(duì)象,而不是logV方法前面的對(duì)象,而innerLog方法是直接調(diào)用的,前面并沒有對(duì)象,這種情況下的this就會(huì)指向全局對(duì)象window,而window的v屬性就是全局變量v,所以結(jié)果會(huì)打印出1。

這時(shí),如果我們想在內(nèi)部函數(shù)中打印出調(diào)用外部函數(shù)的對(duì)象的屬性(例如,在innerLog方法中打印出pro對(duì)象中的v屬性),那么有三種方法可以實(shí)現(xiàn):第一種,在外部方法中將this保存到一個(gè)變量然后在內(nèi)部函數(shù)中調(diào)用;第二種,在外部方法中將內(nèi)部方法關(guān)聯(lián)到對(duì)象上并使用對(duì)象調(diào)用內(nèi)部方法;第三種,將內(nèi)部方法改為接收參數(shù)的方法,并在外部方法中將屬性通過變量傳入內(nèi)部方法。例如,上述代碼中的logV方法可以這么處理。

方法1:

    Program.prototype.logV = function () {
        var instance = this;
        function innerLog(){
            console.log(instance.v);
        }
        innerLog();
    }

方法2:

    Program.prototype.logV = function () {
        function innerLog(){
            console.log(this.v);
        }
        this.innerLog = innerLog;
        this.innerLog();
    }

方法3:

    Program.prototype.logV = function () {
        function innerLog(v){
            console.log(v);
        }
        innerLog(this.v);
    }

這三種方法都會(huì)打印出pro對(duì)象的屬性v(3)。這里跟我們的原則“誰直接調(diào)用方法this就指向誰”并不沖突,只要注意實(shí)際處理業(yè)務(wù)的函數(shù)到底是誰調(diào)用的就可以了。

主站蜘蛛池模板: 乌海市| 姜堰市| 平昌县| 碌曲县| 咸宁市| 凤庆县| 兴隆县| 宁都县| 定安县| 北宁市| 胶南市| 若羌县| 盘山县| 高安市| 眉山市| 乌恰县| 繁峙县| 嘉义市| 蛟河市| 界首市| 兴国县| 高阳县| 喀喇| 临清市| 姜堰市| 宁夏| 巩义市| 龙井市| 福安市| 襄汾县| 遵义县| 高邮市| 麦盖提县| 绿春县| 玉环县| 万山特区| 泌阳县| 沽源县| 庄浪县| 赣州市| 达州市|