js中this有什麼用? js中this關鍵字的用法(附程式碼)
這篇文章帶給大家的內容是關於js中this有什麼用? js中this關鍵字的用法(附程式碼),文章介紹了對js中this的理解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
首先,必須搞清楚在JS裡面,函數的幾種呼叫方式:
1.普通函數呼叫
2.作為方法來呼叫
3.作為建構子來呼叫
4.使用apply/call方法來呼叫
5.Function.prototype.bind方法
6.es6箭頭函數
重點:不管函數以何種方式來調用,誰調用這個函數或方法,this關鍵字就指向誰,牢記這一點。 !important
下面我將對每個方法進行實例講解!
1.this關鍵字的用法之普通函數調用
(function fun(){ this.name="segmentfault"; console.log(this); //window console.log(this.name); //segmentfault })() console.log(window.name); //segmentfault 由此可见name属性属于window的属性。
在這段程式碼中fun函數作為普通函數調用,實際上fun是作為全局物件window的一個方法來進行呼叫的(這點大家應該都知道),即window.fun();所以這個地方是window對象調用了fun方法,那麼fun函數當中的this即指window,同時window還擁有了另外一個屬性name,值為segmentfault.
2.this關鍵字的用法之作為方法來呼叫
var name="segmentfault";
var fun ={
name:"segmentfault-A", showName:function(){ console.log(this.name); //输出 segmentfault-A }
}
fun.showName();
//這裡是fun物件呼叫showName方法,很明顯this關鍵字是指向fun物件的,所以會輸出name
var funA = fun.showName;
funA(); //輸出 segmentfault
//這裡將fun.showName方法賦給funA變量,此時funA變數相當於window物件的一個屬性,因此showNameA()執行的時候相當於window.funA(),即window物件呼叫funA這個方法,所以this關鍵字指向window
換種方式看看:
var funA={ name:"segmentfault", showName:function(){ console.log(this.name); } } var funB={ name:"segmentfault-A", sayName:funA.showName } funB.sayName(); //输出 segmentfault-A //虽然showName方法是在funA这个对象中定义,但是调用的时候却是在funB这个对象中调用,因此this对象指向funB
#3.this關鍵字的用法之作為建構子來呼叫
function fun(name){ this.name=name; } var funA = fun("segmentfault"); console.log(funA.name); // 输出 undefined console.log(window.name);//输出 segmentfault //上面代码没有进行new操作,相当于window对象调用fun("segmentfault")方法,那么this指向window对象,并进行赋值操作window.name="segmentfault". var funB=new fun("segmentfault"); console.log(funB.name);// 输出 segmentfault
4.this關鍵字的用法之call/apply方法的呼叫
在JS裡函數也是對象,因此函數也有方法。從Function.prototype上繼承到Function.prototype.call/Function.prototype.apply方法
call/apply方法最大的作用就是能改變this關鍵字的指向.
#Obj.method.apply( AnotherObj,arguments);
var name="segmentfault-A"; var fun={ name:"segmentfault", showName:function(){ console.log(this.name); } } fun.showName.call(); //输出 "segmentfault-A" //这里call方法里面的第一个参数为空,默认指向window。 //虽然showName方法定义在fun对象里面,但是使用call方法后,将showName方法里面的this指向了window。因此最后会输出"segmentfault-A"; function FruitA(n1,n2){ this.n1=n1; this.n2=n2; this.change=function(x,y){ this.n1=x; this.n2=y; } } var fruitA = new FruitA("cheery","banana"); var FruitB={ n1:"apple", n2:"orange" }; fruitA.change.call(FruitB,"pear","peach"); console.log(FruitB.n1); //输出 pear console.log(FruitB.n2);// 输出 peach
FruitB呼叫fruitA的change方法,將fruitA中的this綁定到物件FruitB上。
5.this關鍵字的用法之Function.prototype.bind()方法
var name="segmentfault-A"; function fun(name){ this.name=name; this.sayName=function(){ setTimeout(function(){ console.log("my name is "+this.name); },50) } } var funA = new fun("segmentfault"); funA.sayName() //输出 “my name is segmentfault-A”; //这里的setTimeout()定时函数,相当于window.setTimeout(),由window这个全局对象对调用,因此this的指向为window, 则this.name则为segmentfault-A
下面用bind()方法就可以輸出segmentfault
var name="segmentfault"; function fun(name){ this.name=name; this.sayName=function(){ setTimeout(function(){ console.log("my name is "+this.name); }.bind(this),50) //注意这个地方使用的bind()方法,绑定setTimeout里面的匿名函数的this一直指向fun对象 } } var funA = new fun("segmentfault"); funA.sayName() //输出 “my name is segmentfault”; //这里的setTimeout()定时函数,相当于window.setTimeout(),由window这个全局对象对调用,因此this的指向为window, 则this.name则为segmentfault
這裡setTimeout(function(){console.log(this.name)}.bind(this),50);,匿名函數使用bind(this)方法後創建了新的函數,這個新的函數不管在什麼地方執行,this都指向的fun,而非window,因此最後的輸出為"my name is segmentfault"而不是"my name is segmentfault-A"
另外幾個需要注意的地方:
setTimeout/setInterval/匿名函數執行的時候,this預設會指向window對象,除非手動改變this的指向。在《javascript高級程式設計》當中,寫到:「超時呼叫的程式碼(setTimeout)都是在全域作用域中執行的,因此函數中的this的值,在非嚴格模式下是指向window對象,在嚴格模式下是指向undefined」。本文都是在非嚴格模式下的情況。
6.this關鍵字的用法之Eval函數
該函數執行的時候,this綁定到目前作用域的物件上
var name="segmentfault-A"; var fun = { name:"segmentfault", showName:function(){ eval("console.log(this.name)"); } } fun.showName(); //输出 "segmentfault" var a = fun.showName; a(); //输出 "segmentfault-A"
7.this關鍵字的用法之箭頭函數
es6裡面this指向固定化,始終指向外部對象,因為箭頭函數沒有this,因此它自身不能進行new實例化,同時也不能使用call, apply, bind等方法來改變this的指向。
function Timer() { this.seconds = 0; setInterval( () => this.seconds ++, 1000); } var timer = new Timer(); setTimeout( () => console.log(timer.seconds), 3000); // 3 // 在构造函数内部的setInterval()内的回调函数,this始终指向实例化的对象,并获取实例化对象的seconds的属性,每1s这个属性的值都会增加1。否则最后在3s后执行setTimeOut()函数执行后输出的是0
相關推薦:
#關於js裡的this關鍵字的理解_javascript技巧
一個對於js this關鍵字的問題_javascript技巧
以上是js中this有什麼用? js中this關鍵字的用法(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
