- 看透JavaScript:原理、方法與實(shí)踐
- 韓路彪
- 565字
- 2020-11-28 15:50:48
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)用的就可以了。
- VMware View Security Essentials
- Mastering AWS Lambda
- 控糖控脂健康餐
- Programming ArcGIS 10.1 with Python Cookbook
- Python程序設(shè)計(jì)案例教程
- C語言程序設(shè)計(jì)案例式教程
- 深度強(qiáng)化學(xué)習(xí)算法與實(shí)踐:基于PyTorch的實(shí)現(xiàn)
- 量化金融R語言高級(jí)教程
- BIM概論及Revit精講
- Julia高性能科學(xué)計(jì)算(第2版)
- 一塊面包板玩轉(zhuǎn)Arduino編程
- 響應(yīng)式Web設(shè)計(jì):HTML5和CSS3實(shí)戰(zhàn)(第2版)
- Arduino計(jì)算機(jī)視覺編程
- Java并發(fā)編程:核心方法與框架
- C陷阱與缺陷