JS中this的指向以及call、apply的作用
這篇文章跟大家分享了JS基礎內容this指向以及call、apply的相關知識點內容,有興趣的朋友可以學習參考下。
在具體的實際應用中,this 的指向無法在函數定義時確定,而是在函數執行的時候才確定的,根據執行時的環境大致可以分為以下3種:
1、當函數作為普通函數呼叫時,this 指向全域物件
2、當函數作為物件的方法呼叫時,this 指向該物件
3、當函數作為建構器呼叫時,this 指向新建立的物件
#範例一:
window.name = 'myname'; function getName() { console.log(this.name); } getName(); //输出myname
#範例二:
var boy = { name: 'Bob', getName: function() { console.log(this.name); } } boy.getName(); //输出Bob
範例三:
function Boy(name) { this.name = name; } var boy1 = new Boy('Bob'); console.log(boy1.name); //输出Bob
對於範例三,還有一種特殊情況,就是當建構子透過"return" 傳回的是一個物件的時候,這次運算的最終結果返回的就是這個對象,而不是新創建的對象,因此this 在這種情況下並沒有什麼用。
範例四:
function Boy(name) { this.name = name; return { //返回一个对象 name: 'Jack' } } var boy1 = new Boy('Bob'); console.log(boy1.name); //输出Jack
範例五:
function Boy(name) { this.name = name; return 1; //返回非对象 } var boy1 = new Boy('Bob'); console.log(boy1.name); //输出Bob
call 和apply的作用
apply 接受兩個參數,第一個參數指定了函數體內this 的指向,第二個參數是一個數組或類別數組,用來傳遞被呼叫函數的參數列表。
範例一:
function getInfo() { console.log(this.name+' like '+arguments[0]+' and '+arguments[1]); } var boy1 = { name: 'Bob', age: 12 } getInfo.apply(boy1,['sing','swimming']); //输出Bob like sing and swimming
call 傳入參數的數量是不固定的,跟apply 相同的是,第一個參數也是用來指定函數體內this 的指向,從第二個參數開始往後,每個參數依序傳入被呼叫函數。
範例二:
function getInfo() { console.log(this.name+' like '+arguments[0]+' and '+arguments[1]); } var boy1 = { name: 'Bob', age: 12 } getInfo.call(boy1,'sing','shopping'); //输出Bob like sing and shopping
此外,大部分進階瀏覽器也實作了bind 方法,它與call 和apply 的差別在於bind 只是改變函數內部this 的指向,但不會立即執行,你需要顯示呼叫它。
範例三:模擬瀏覽器的bind 方法
Function.prototype.bind = function(obj){ var self = this; return function(){ return self.apply(obj,arguments); } }; var obj = { name: 'Bob', age: 12 }; var func = function(){ console.log(this.name+' like '+arguments[0]+' and '+arguments[1]); }.bind(obj); func('sing','shopping');
遺失的this
在某些情況下會失去this 的指向,此時,我們就需要藉助call、apply 和bind 來改變this 的指向問題。
範例一:當"getName" 方法作為"boy" 物件的屬性呼叫時,this 指向"boy" 對象,當另一個變數引用"getName" 方法時,因為它是作為普通函數調用,所以this 指向全域物件window
var boy = { name: 'Bob', getName: function() { console.log(this.name); } } boy.getName(); //输出Bob var getBoyName = boy.getName; getBoyName(); //输出undefined
範例二:即使在函數內部定義的函數,如果它作為普通物件調用,this 同樣指向window 物件
var boy1 = { name: 'Bob', age: 12, getInfo: function() { console.log(this.name); function getAge() { console.log(this.age); } getAge(); } } boy1.getInfo(); //Bob //undefined
以上就是本章的全部內容,更多相關教學請訪問JavaScript影片教學!
以上是JS中this的指向以及call、apply的作用的詳細內容。更多資訊請關注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)

資料準備為了聚合查詢的條件,增加了幾個資料。 MIN我們試著獲取最小的年齡。方法實作@OverridepublicIntegergetAgeMin(){Mapresult=testFluentMybatisMapper.findOneMap(newTestFluentMybatisQuery().select.min.age("minAge").end()).orElse(null);returnresult!=getreult.toInt(Mvert.toInt(null); (&qu

這篇文章帶大家解讀vue原始碼,來介紹一下Vue2中為什麼可以使用 this 存取各種選項中的屬性,希望對大家有幫助!

同事因為this指向的問題卡住的bug,vue2的this指向問題,使用了箭頭函數,導致拿不到對應的props。當我跟他介紹的時候他竟然不知道,隨後也刻意的看了一下前端交流群,至今最起碼還有70%以上的前端程式設計師搞不明白,今天給大家分享一下this指向,如果啥都沒學會,請給我一個大嘴巴子。

jQuery中this關鍵字的靈活運用在jQuery中,this關鍵字是一個非常重要且靈活的概念,它用來引用目前正在操作的DOM元素。透過合理的運用this關鍵字,我們可以方便地操作頁面中的元素,實現各種互動效果和功能。本文將結合具體的程式碼範例,介紹this關鍵字在jQuery中的靈活運用。簡單的this範例首先,我們來看一個簡單的this範例。假設我們有一

什麼是this?以下這篇文章跟大家介紹一下JavaScript中的this,並聊聊this在函數不同呼叫方式下的區別,希望對大家有所幫助!

JavaScript如何改變this指向?以下這篇文章跟大家介紹一下JS改變this指向的三種方法,希望對大家有幫助!

一、this關鍵字1.this的類型:哪個物件呼叫就是哪個物件的參考類型二、用法總結1.this.data;//存取屬性2.this.func();//存取方法3.this( );//呼叫本類別中其他建構方法三、解釋用法1.this.data這種是在成員方法中使用讓我們來看看不加this會出現什麼樣的狀況classMyDate{publicintyear;publicintmonth;publicintday; publicvoidsetDate(intyear,intmonth,intday){ye

JavaScript中箭頭函數是一種比較新的語法,沒有自己的this關鍵字,相反箭頭函數的this指向包含它的作用域對象,影響方面有:1、箭頭函數中的this是靜態的;2、箭頭函數不能作為構造函數使用;3、箭頭函數不能用作方法。
