上一篇,談了對象和對象的關係,如今咱們談談對象和函數的關係app
先說結論,也就是觀點1函數
首先咱們根據場景,去理解this的出現能夠解決什麼問題。this
var obj = { name : 'ziwei', sayName: function(x){ return console.log('hello,' + x.name) } }
如今咱們不用this,咱們就只能這樣調方法
obj.sayName(obj)code
可是通常而言,咱們用obj調用sayName,確定就是但願讓這個對象說本身的名字對象
爲了可以obj.sayName(),讓這個obj本身的傳遞進去,JS之父發明了this.作用域
this的出現,就能夠解決obj.sayName(obj)時,不用本身傳遞obj進去,而是直接obj,sayName(),讓JS會幫你傳遞obj參數進去io
你能夠理解爲JS作了一件事情,就是你每次調用函數時,都偷偷給你傳遞了一個參數,你用this就能夠拿到這個參數。console
var obj = { name : 'ziwei', sayName: function(){ return console.log('hello,' + this.name) } } obj.sayName()
可是這樣,其實對於新手很不友好。我obj.sayName(),根本沒傳遞參數,那他是怎麼輸出obj的name的呢?function
因此JS偷偷的傳遞this參數這件事情,咱們將它顯式的展出來就好理解了。構造函數
實際上,JS就是作了這樣一件事情,顯式的指定this是obj. obj.sayName.call(obj)
回顧一下:
隱式模式: obj.sayName()
顯示模式: obj.sayName.call(obj)
JS函數被調用時,必定會有這2個參數
若是你用call()調用函數,就是顯式的傳遞this和arguments
若是你用()語法直接調用函數,那JS就去幫你偷偷的傳遞this。它怎麼幫你傳遞呢? 這個問題暫時無論,下面會說。
JS其實爲了用this,想了不少折中方案。
包括(1)函數調用有兩種語法 , 把函數的參數劃分爲this和arguments
一個三段論
JS偷偷幫你傳遞參數的規則 (也就是你使用()語法調用時)
這個this是誰? function a(){ console.log(this) } 答案: 不肯定,this是參數,函數沒有調用,怎麼肯定參數的?
function a(){ 'use strict' console.log(this) } a() 答案: undefined, 嚴格模式下, 全局做用域下this再也不是window,而是undefiend
新手不會this的主要緣由,是不清楚函數的另外一個調用方式call(),
由於用call()就是本身傳遞this, 用()就是JS偷偷幫你傳遞this,既然是JS按照他本身的規則,偷偷給你傳遞的,你確定要懵逼搞不清的
就像手動檔和自動擋開車同樣