日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript this關(guān)鍵字的深入詳解

瀏覽:183日期:2023-10-05 13:28:22
一、前言

this關(guān)鍵字是JavaScript中最復(fù)雜的機(jī)制之一。它是一個很特別的關(guān)鍵字,被自動定義在所有函數(shù)的作用域中。對于那些沒有投入時間學(xué)習(xí)this機(jī)制的JavaScript開發(fā)者來說,this的綁定一直是一件非常令人困惑的事。

JavaScript this關(guān)鍵字的深入詳解

二、了解this

學(xué)習(xí)this的第一步是明白this既不指向函數(shù)自身也不指向函數(shù)的詞法作用域,你也許被這樣的解釋誤導(dǎo)過,但其實它們都是錯誤的。隨著函數(shù)使用場合的不同,this的值會發(fā)生變化。但總有一條原則就是 JS中的this代表的是當(dāng)前行為執(zhí)行的主體 ,在JS中主要研究的都是函數(shù)中的this,但并不是說只有在函數(shù)里才有this, this實際上是在函數(shù)被調(diào)用時發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用 。如何的區(qū)分this呢?

三、this到底是誰

這要分情況討論,常見有五種情況:

1、函數(shù)執(zhí)行時首先看函數(shù)名前面是否有'.',有的話,'.'前面是誰,this就是誰;沒有的話this就是window

function fn(){ console.log(this);}var obj={fn:fn};fn();//this->windowobj.fn();//this->objfunction sum(){ fn();//this->window}sum();var oo={ sum:function(){ console.log(this);//this->oo fn();//this->window }};oo.sum();

2、自執(zhí)行函數(shù)中的this永遠(yuǎn)是window

(function(){ //this->window })(); ~function(){ //this->window }();

3、給元素的某一個事件綁定方法,當(dāng)事件觸發(fā)的時候,執(zhí)行對應(yīng)的方法,方法中的this是當(dāng)前的元素,除了IE6~8下使用attachEvent(IE一個著名的bug)

DOM零級事件綁定

oDiv.onclick=function(){ //this->oDiv };

DOM二級事件綁定

oDiv.addEventListener('click',function(){ //this->oDiv },false);

在IE6~8下使用attachEvent,默認(rèn)的this就是指的window對象

oDiv.attachEvent('click',function(){ //this->window });

我們大多數(shù)時候,遇到事件綁定,如下面例子這種,對于IE6~8下使用attachEvent不必太較真

function fn(){ console.log(this);}document.getElementById('div1').onclick=fn;//fn中的this就是#divldocument.getElementById('div1').onclick=function(){console.log(this);//this->#div1fn();//this->window};

4、在構(gòu)造函數(shù)模式中,類中(函數(shù)體中)出現(xiàn)的this.xxx=xxx中的this是當(dāng)前類的一個實例

function CreateJsPerson(name,age){//瀏覽器默認(rèn)創(chuàng)建的對象就是我們的實例p1->thisthis.name=name;//->p1.name=namethis.age=age;this.writeJs=function(){console.log('my name is'+this.name +',i can write Js'); };//瀏覽器再把創(chuàng)建的實例默認(rèn)的進(jìn)行返回}var p1=new CreateJsPerson('尹華芝',48);

必須要注意一點: 類中某一個屬性值(方法),方法中的this需要看方法執(zhí)行的時候,前面是否有'.',才能知道this是誰 。大家不妨看下接下來的這個例子,就可明白是啥意思。

function Fn(){this.x=100;//this->f1this.getX=function(){console.log(this.x);//this->需要看getX執(zhí)行的時候才知道 }}var f1=new Fn;f1.getX();//->方法中的this是f1,所以f1.x=100var ss=f1.getX;ss();//->方法中的this是window ->undefined

5.call、apply和bind

我們先來看一個問題,想在下面的例子中this綁定obj,怎么實現(xiàn)?

var obj={name:'浪里行舟'};function fn(){console.log(this);//this=>window}fn();obj.fn();//->Uncaught TypeError:obj.fn is not a function

如果直接綁定obj.fn(),程序就會報錯。這里我們應(yīng)該用fn.call(obj)就可以實現(xiàn)this綁定obj,接下來我們詳細(xì)介紹下call方法:

call方法的作用:

①首先我們讓原型上的call方法執(zhí)行,在執(zhí)行call方法的時候,我們讓fn方法中的this變?yōu)榈谝粋€參數(shù)值obj;然后再把fn這個函數(shù)執(zhí)行。

②call還可以傳值,在嚴(yán)格模式下和非嚴(yán)格模式下,得到值不一樣。

//在非嚴(yán)格模式下var obj={name:'浪里行舟 '};function fn(num1,num2){console.log(num1+num2);console.log(this);}fn.call(100,200);//this->100 num1=200 num2=undefinedfn.call(obj,100,200);//this->obj num1=100 num2=200fn.call();//this->windowfn.call(null);//this->windowfn.call(undefined);//this->window

//嚴(yán)格模式下 fn.call();//在嚴(yán)格模式下this->undefinedfn.call(null);// 在嚴(yán)格模式 下this->nullfn.call(undefined);//在嚴(yán)格模式下this->undefined

**apply和call方法的作用是一模一樣的,都是用來改變方法的this關(guān)鍵字并且把方法

執(zhí)行,而且在嚴(yán)格模式下和非嚴(yán)格模式下對于第一個參數(shù)是null/undefined這種情況的規(guī)

律也是一樣的。**

兩者唯一的區(qū)別:call在給fn傳遞參數(shù)的時候,是一個個的傳遞值的,而apply不是一個個傳,而是把要給fn傳遞的參數(shù)值統(tǒng)一的放在一個數(shù)組中進(jìn)行操作。但是也相當(dāng)子一個個的給fn的形參賦值。 總結(jié)一句話:call第二個參數(shù)開始接受一個參數(shù)列表,apply第二個參數(shù)開始接受一個參數(shù)數(shù)組

fn.call(obj,100,200);fn.apply(obj,[100,200]);

bind:這個方法在IE6~8下不兼容,和call/apply類似都是用來改變this關(guān)鍵字的 ,但是和這兩者有明顯區(qū)別:fn.call(obj,1,2);//->改變this和執(zhí)行fn函數(shù)是一起都完成了

fn.bind(obj,1,2);//->只是改變了fn中的this為obj,并且給fn傳遞了兩個參數(shù)值1、2, 但是此時并沒有把fn這個函數(shù)執(zhí)行var tempFn=fn.bind(obj,1,2);tempFn(); //這樣才把fn這個函數(shù)執(zhí)行

bind體現(xiàn)了預(yù)處理思想:事先把fn的this改變?yōu)槲覀兿胍慕Y(jié)果,并且把對應(yīng)的參數(shù)值也準(zhǔn)備好,以后要用到了,直接的執(zhí)行即可。

call和apply直接執(zhí)行函數(shù),而bind需要再一次調(diào)用。

var a ={ name : 'Cherry', fn : function (a,b) { console.log( a + b) } } var b = a.fn; b.bind(a,1,2)

JavaScript this關(guān)鍵字的深入詳解

上述代碼沒有執(zhí)行,bind返回改變了上下文的一個函數(shù),我們必須要手動去調(diào)用:

b.bind(a,1,2)() //3

必須要聲明一點:遇到第五種情況(call apply和bind),前面四種全部讓步。

四、箭頭函數(shù)this指向

箭頭函數(shù)正如名稱所示那樣使用一個“箭頭”(=>)來定義函數(shù)的新語法,但它優(yōu)于傳統(tǒng)的函數(shù),主要體現(xiàn)兩點: 更簡短的函數(shù)并且不綁定this 。

var obj = { birth: 1990, getAge: function () { var b = this.birth; // 1990 var fn = function () { return new Date().getFullYear() - this.birth; // this指向window或undefined }; return fn(); }};

現(xiàn)在,箭頭函數(shù)完全修復(fù)了this的指向, 箭頭函數(shù)沒有自己的this,箭頭函數(shù)的this不是調(diào)用的時候決定的,而是在定義的時候處在的對象就是它的this 。

換句話說, 箭頭函數(shù)的this看外層的是否有函數(shù),如果有,外層函數(shù)的this就是內(nèi)部箭頭函數(shù)的this,如果沒有,則this是window 。

<button id='btn1'>測試箭頭函數(shù)this_1</button> <button id='btn2'>測試箭頭函數(shù)this_2</button> <script type='text/javascript'> let btn1 = document.getElementById(’btn1’); let obj = { name: ’kobe’, age: 39, getName: function () { btn1.onclick = () => { console.log(this);//obj }; } }; obj.getName(); </script>

JavaScript this關(guān)鍵字的深入詳解

上例中,由于箭頭函數(shù)不會創(chuàng)建自己的this,它只會從自己的作用域鏈的上一層繼承this。其實可以簡化為如下代碼:

let btn1 = document.getElementById(’btn1’); let obj = { name: ’kobe’, age: 39, getName: function () { console.log(this) } }; obj.getName();

那假如上一層并不存在函數(shù),this指向又是誰?

<button id='btn1'>測試箭頭函數(shù)this_1</button> <button id='btn2'>測試箭頭函數(shù)this_2</button> <script type='text/javascript'> let btn2 = document.getElementById(’btn2’); let obj = { name: ’kobe’, age: 39, getName: () => { btn2.onclick = () => { console.log(this);//window }; } }; obj.getName(); </script>

JavaScript this關(guān)鍵字的深入詳解

上例中,雖然存在兩個箭頭函數(shù),其實this取決于最外層的箭頭函數(shù),由于obj是個對象而非函數(shù),所以this指向為Window對象

由于this在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以, 用call()或者apply()調(diào)用箭頭函數(shù)時,無法對this進(jìn)行綁定,即傳入的第一個參數(shù)被忽略 :

var obj = { birth: 1990, getAge: function (year) { var b = this.birth; // 1990 var fn = (y) => y - this.birth; // this.birth仍是1990 return fn.call({birth:2000}, year); }};obj.getAge(2018); // 28擴(kuò)展閱讀

箭頭函數(shù)-廖雪峰

JS中的箭頭函數(shù)與this

this、apply、call、bind

總結(jié)

到此這篇關(guān)于JavaScript this關(guān)鍵字深入詳解的文章就介紹到這了,更多相關(guān)JavaScript this關(guān)鍵字內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人va天堂| 蜜桃91丨九色丨蝌蚪91桃色| 欧美日韩调教| 婷婷精品在线| 国产精品**亚洲精品| 精品成av人一区二区三区| 国产亚洲一区二区三区啪| 国产精品成人3p一区二区三区| 国产精品欧美一区二区三区不卡| 精品一区二区三区在线观看视频| 国产理论在线| 亚洲女同中文字幕| 婷婷精品在线| a国产在线视频| 九九久久婷婷| 婷婷久久免费视频| 久久精品国产久精国产| 日本精品不卡| 亚洲精品黄色| 精品九九在线| 欧美午夜不卡| 日本午夜免费一区二区| 精品久久久网| 一区三区视频| 国产精品久久久久久妇女| 久久毛片亚洲| 日韩在线一区二区| 精品视频在线观看网站| 美女毛片一区二区三区四区 | 伊人久久亚洲影院| 日韩成人午夜精品| 亚洲va中文在线播放免费| 久久av一区二区三区| 国产精品一区二区三区美女| 日韩欧美少妇| 国产探花一区| 婷婷成人基地| 精品三级av| 丝袜美腿成人在线| 中文字幕在线高清| 日韩av三区| 99热精品久久| 久久av偷拍| 日韩专区一卡二卡| 亚洲精品福利电影| 青青草91视频| 国产女优一区| 亚洲风情在线资源| 国产精品一区二区免费福利视频| 婷婷激情一区| 欧美激情五月| 亚洲精品在线国产| 亚洲精品91| 日韩欧美二区| 九九久久国产| 日韩高清二区| 在线看片一区| 亚洲激情婷婷| 国产一区亚洲| 97在线精品| 国产精品蜜月aⅴ在线| 中文字幕成人| 欧美一级专区| 免费黄色成人| 精品国产亚洲一区二区三区大结局| 蜜桃av一区二区| 日韩视频免费| 91精品综合| 亚洲日本网址| 国产精品伦理久久久久久| 国产精品蜜月aⅴ在线| 婷婷亚洲成人| 蜜臀久久久99精品久久久久久| 91精品国产成人观看| 国产在线一区不卡| 久久精品一本| 精品五月天堂| 精品高清久久| 精品久久视频| 久久精品国产久精国产爱| 欧美亚洲综合视频| 日本精品另类| 日韩和欧美一区二区| 亚洲精品动态| 综合激情一区| 亚洲精品激情| 亚洲精品日本| 欧美在线观看天堂一区二区三区| 偷拍亚洲精品| 欧美日韩午夜电影网| 久久精品99久久久| 欧美日韩中文| 免费在线亚洲欧美| 精品久久久网| 日本精品黄色| 久久美女精品| 欧美特黄一级| 首页欧美精品中文字幕| 免费成人在线视频观看| 综合一区av| 久久精品99久久久| 国产一区二区三区成人欧美日韩在线观看| 久久只有精品| 欧美精品日日操| 欧美~级网站不卡| 免播放器亚洲| 日本va欧美va精品| 久久精品国产久精国产| 成人欧美一区二区三区的电影| 高清久久精品| 激情婷婷亚洲| 中文字幕日韩亚洲| 开心激情综合| 精品一区在线| 日韩国产在线不卡视频| 老牛国内精品亚洲成av人片| 日韩精品首页| 亚洲免费福利一区| 精品久久亚洲| 亚洲免费播放| 清纯唯美亚洲综合一区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 日韩福利视频导航| 久久精品亚洲| 欧美精品羞羞答答| 日韩精品一级| 精品久久影院| 99国内精品| 国产精品主播| 极品日韩av| 欧美日韩一区二区三区四区在线观看| 国产在线一区不卡| 黑丝一区二区| 国产亚洲人成a在线v网站| 国产自产自拍视频在线观看| 午夜精品免费| 国产精品对白久久久久粗| 中文字幕系列一区| 日韩中文字幕在线一区| 国产一区二区三区探花| 日韩视频不卡| 成人污污视频| 亚洲+小说+欧美+激情+另类| 精品久久99| 亚洲精品日本| 秋霞影视一区二区三区| 中文无码日韩欧| 欧美激情91| 首页亚洲欧美制服丝腿| 精品欧美视频| 午夜视频一区二区在线观看| 丁香六月综合| 欧美一级网址| 99视频一区| 97精品国产福利一区二区三区| 中文字幕中文字幕精品| 三上悠亚国产精品一区二区三区| 欧美日韩一区二区三区四区在线观看 | 国产精品视频首页| 亚洲欧洲一区| 欧美成人a交片免费看| 日韩激情一二三区| 黄色av日韩| 亚洲一区资源| 麻豆视频观看网址久久| 亚洲aa在线| 夜久久久久久| 成人啊v在线| 久久精品福利| 日韩欧美久久| 亚洲欧美视频一区二区三区| 精品九九在线| 国产欧美日韩| 亚洲毛片在线| 悠悠资源网久久精品| 中文字幕在线视频久| 国产精品亚洲综合久久| 热久久免费视频| 夜久久久久久| 午夜精品影院| 久久久久午夜电影| 国产美女高潮在线观看| 国产精品草草| 国产乱码精品一区二区亚洲| 日本一区中文字幕| 丝瓜av网站精品一区二区 | 国产美女一区| 九九综合九九| 99久久九九| 久久久噜噜噜| 欧美日韩视频网站| 国产成人精选| 国内一区二区三区| 久久伊人久久| 国产高清亚洲| 国产美女视频一区二区| 欧美在线首页| 国产精品99精品一区二区三区∴ | 国产一区亚洲| 免费观看久久av|