前些日子面試的時候用到了this,面試官說我的理解有點偏差,回來看了下書和一些博客,做了點測試,發現自己的理解的確有誤
1.全局變量
應該是最常用的吧,函數中調用一個this,這里其實就是全局變量
1
2
3
4
|
var value= "0" ; function mei(){ var value= "1" ; console.log( this .value); //0 console.log(value); //1 } mei(); |
輸出0就是因為this指向的是全局
2.構造函數
這是我比較熟悉的用法,構造函數中用this,new一個新的對象后this就指向了這個新的對象
1
2
3
4
5
6
7
|
var value= "window" ; function mei(){ this .value=1; this .show= function (){ console.log( this .value) } } var m= new mei(); console.log(m.value); //1 m.show(); //1 |
可以看到輸出的是1而并不是window,可見由于構造函數,這里的this已經指向新的對象了而不是全局變量
3.call和apply
直接借用我的call和apply的博客中的例子
1
2
3
4
5
6
7
8
|
var p= "456" ; function f1(){ this .p= "123" ; } function f2() { console.log( this .p); } f2(); //456 f2.call(f1()); //123 f2.apply(f1()); //123 |
第一行輸出456很好理解,this指向全局,后面的123是因為使用了call或者apply后,f2中的this指向了f1,而f1中的p為123,具體解釋直接戳那篇博文
4.函數作為某個對象的方法調用(我出錯的地方)
當時讓我寫一個對象有幾個方法,我腦子一抽定義了個全局變量,然后在對象的方法里用this調用,面試官問我這個this是什么?我說應該是window,因為這種方式我用的少,以為只有new或者call才會改變this的指向,他就說不對,讓我回去自己看看,現在試了試,我還真是錯了,貼代碼
1
2
3
4
5
|
var value= "father" ; function mei(){} mei.value= "child" ; mei.get= function (){console.log( this .value)}; mei.show= function (){console.log(value)}; mei.get(); //child mei.show(); //father |
由于get是作為mei的方法調用的,因此這里的this指向了mei.value所以輸出child
至于father我是這樣理解的,show指向的函數是定義在全局環境下的,由于作用域鏈,在show中沒有找到value,于是就去定義他的環境中找,這就找到了全局的value,如果這里有理解錯誤的話希望有朋友可以指出來!