好比說有這麼一段代碼:javascript
var O = function(data){ this.data = data } O.prototype.selfCall = function(data){ if(data.length>1){ data.forEach(function(e){console.log(this)}) }else{ console.log(this); } } var o = new O("test") o.selfCall([1]) o.selfCall([1,2])
輸出的結果是:java
O { data: 'test' } { DTRACE_NET_SERVER_CONNECTION: [Function], DTRACE_NET_STREAM_END: [Function], DTRACE_HTTP_SERVER_REQUEST: [Function], DTRACE_HTTP_SERVER_RESPONSE: [Function], DTRACE_HTTP_CLIENT_REQUEST: [Function], DTRACE_HTTP_CLIENT_RESPONSE: [Function], ...
第一個輸出的this是確實指向了對象O,可是第二個由於套了一個function,因此這時候的this就指向了函數自己。
若是想用this指向O的話,能夠這麼寫:segmentfault
O.prototype.selfCall = function(data){ n = this if(data.length>1){ data.forEach(function(e){console.log(n)}) }else{ console.log(this); } }
就是在函數外面用n存一下this,以後靠着函數的lexical(是這麼說的麼?)關係,拿外層的n來引用O。不過前段時間看過別人講=>能夠傳遞this。當時不知道這有什麼意義,如今看來確實是很好的一個特性。因此上面的程序能夠改爲這樣:函數
O.prototype.selfCall = function(data){ if(data.length>1){ data.forEach(e=>{console.log(this)}) }else{ console.log(this); } }
總結:this
function(){}裏面的this指代的是function自己prototype
能夠經過lexical scope藉助一個變量把外面的this傳進function(){}code
=>不單單讓匿名函數的書寫更簡單,還有一個很是好的特性:this的傳遞對象
=>同時還會避免arguments指向匿名函數:參見回調+遍歷ip