對於JavaScript中this關鍵字的理解
這是我第二遍學this了,第一遍學的懵懵的。this指哪裏都是憑我一個男人的直覺然後控制臺輸出看看對不對。
剛查了書、博客、視頻。理解差不多了。畢竟菜雞me;
一、首先介紹下什麽是this
this是一個標識符,它需要和值進行綁定,和變量差不多;但是在你的代碼中,它不是和某個具體的值進行綁定。而是綁定到正確的對象上,一般來說參數究竟綁定在哪個對象上都是由定位函數參數規則所決定的。
二、this對象是在運行時基於函數的執行環境綁定的,當函數被作為某個對象的方法調用時,this等於那個對象。
代碼一
1 var name = "全局"; 2 var obj = { 3 name : "object",4 getNameFunc : function() { 5 console.log(this.name); 6 } 7 }; 8 obj.getNameFunc();
三、相同的在全局函數是this就是window;但是匿名函數的執行環境的執行環境具有全局性所以代碼2就有的解釋啦
代碼二
var name = "全局"; var obj = { name : "object", getNameFunc : function() { return function(){ console.log(this.name); }; } }; obj.getNameFunc() ();
四、在JavaScript高程中作者說每個函數在調用時都會自動取得兩個變量:this和argutments。內部函數在搜索這兩個變量時,只會搜索到其活動對象為止。因此永遠不可能直接訪問外部函數的這兩個變量。把外部作用域中的this對象保存在一個閉包能訪問到的地方;如代碼三
代碼三
1 var name = "全局"; 2 var obj = { 3 name : "object", 4 getNameFunc : function() { 5 var biubiu =this; 6 return function(){ 7 console.log(biubiu.name); 8 }; 9 } 10 }; 11 obj.getNameFunc() ();
五 ;總結
關鍵詞this使得我們可以僅創建一個函數對象,就可以將其作為方法用在一些其他的對象上,每次我們調用該方法時它便可以調用他的對象。對於節省內存十分有用。
這都是因為this得以實現。(我也不大懂Twitter前培訓主管視頻中看到的。)
六、練習
預測this
var fn = function(one, two){ log(this, one, two); }; var r ={ }, g = {}, b = {}; r.method = fn; r.method(g,b);
答案是: r 對象。g,b 是one ,two。沒疑問吧。r點method 這個是對象吧。對象this
當函數被作為某個對象的方法調用時,this等於那個對象。
var fn = function(one, two){ log(this, one, two); }; var r ={ }, g = {}, b = {}; r.method = fn; fn(g,b);
答案是全局:因為這次不是作為函數調用
var x = "我是全局變量"; //定義全局變量x function a(){ //定義函數類結構a this.x = "我是在函數類結構a中聲明的哦"; } //定義普通函數,彈出當前指針所包含的變量x的值 function f(){ alert (this.x); } f.call(new a());
call()的官方解釋,“調用一個對象的一個方法,以另一個對象替換當前對象。”,
f.call(new a())就是把函數(其實也是對象)f復制到被調用對象“new a()”下面去解析.我的理解是還沒細細研究。
new 這個我還沒學到。
關鍵在於this,對,關鍵還是在於this的作用域。this的作用域不是定義它的函數的作用域,而是執行時的作用域。
對於JavaScript中this關鍵字的理解