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

您的位置:首頁技術文章
文章詳情頁

淺談JavaScript中this的指向更改

瀏覽:201日期:2023-10-19 18:20:05

JS中this指向的更改

JavaScript 中 this 的指向問題 前面已經總結過,但在實際開中, 很多場景都需要改變 this 的指向。 現在我們討論更改 this 指向的問題。

call更改this指向

call 的使用語法:func.call(thisArg, arg1, arg2, ...)

call 方法需要一個指定的 this 值( this要指向的對象 )和一個或者多個參數。提供的 this 值會更改調用函數內部的 this 指向。

// 使用 call 方法改變調用函數執行上下文的 this 指向var animal = ’小貓’;var times = ’15小時’;function greet() { let str = this.animal + ’睡覺時間一般為:’ + this.times; console.log(str);}var dogObj = { animal: ’小狗’, times: ’8小時’};var pigObj = { animal: ’小豬’, times: ’13小時’}greet(); // 小貓睡覺時間一般為:15小時greet.call(dogObj); // 小狗睡覺時間一般為:8小時greet.call(pigObj); // 小豬睡覺時間一般為:13小時greet.call(); // 小貓睡覺時間一般為:15小時

當直接調用函數 greet 時,函數 greet 內部的 this 指向的是全局對象 Window。

函數 greet 調用 call() 方法并傳遞對象 dogObj 時,函數 greet 內部的 this 就指向了對象 dogObj 。

函數 greet 調用 call() 方法并傳遞對象 pigObj 時,函數 greet 內部的 this 就指向了對象 pigObj 。

call()不傳參的話,在嚴格模式下,this 的值將會是 undefined;否則將會指向全局對象 Window。

匿名函數調用call方法:

var books = [{ name: ’CSS選擇器’, price: 23}, { name: ’CSS世界’, price: 35}, { name: ’JavaScript語言設計’, price: 55}];for (var i = 0; i < books.length; i++) { (function (i) { // 這里this指向的是call綁定的數組的每一個元素對象 this.printf = function () { console.log(`${i} ${this.name}: ¥${this.price}`); } this.printf(); }).call(books[i], i);}// 打印結果如下:// 0 CSS選擇器: ¥23// 1 CSS世界: ¥35// 2 JavaScript語言設計: ¥55

call實現繼承:

// 實現兩個數相加的構造函數function CalcA(){ this.add = function(a, b){ return a + b; }}// 實現兩個數相減的構造函數function CalcS(){ this.sub = function(a, b){ return a - b; }}// 計算構造函數function Calc(){ console.log(this); // Calc {} CalcA.call(this); CalcS.call(this); console.log(this); // Calc {add: ƒ, sub: ƒ}}var calc = new Calc();console.log(calc.add(2, 3)); // 5console.log(calc.sub(10, 1));// 9

構造函數 Calc 通過 call 方法使構造函數 CalcA、CalcS中的 this 指向了 Calc 自己,從而繼承了它們的屬性及方法。所以,構造函數 Calc 生成的實例對象也能夠訪問構造函數 CalcA、CalcS中的屬性及方法。

apply方法更改this指向

apply 的使用語法:func.apply(thisArg, [argsArray])

apply 的用法與 call 方法類似,只不過 call 方法接受的是參數列表,而 apply 方法接受的是一個數組或者類數組對象。上面的例子完全可以將 call 更換為 apply,只不過 apply 方法只能接受兩個參數,而且第二個參數是一個數組或者類數組對象。

bind方法更改this指向

bind 的使用語法:func.bind(thisArg, arg1, arg2, ...)

bind 的參數與 call 相同,但是 bind 返回的是一個改變this指向后的函數實例。

var petalNum = 100;function Flower() { this.petalNum = Math.ceil(Math.random() * 10) + 1;}Flower.prototype.declare = function() { console.log(this); console.log(’this is a beautiful flower with ’ + this.petalNum + ’ petals’);}Flower.prototype.bloom = function() { console.log(this); // Flower {petalNum: 7} // 如果不綁定 this 就會指向 Window 全局對象 window.setTimeout(this.declare, 1000); // bind 綁定 this,指向 Flower 的原型對象 window.setTimeout(this.declare.bind(this), 2000);}var flower = new Flower();flower.bloom();

實例對象 flower 調用 bloom 方法后,bloom 內的 this 指向構造函數的原型對象。

1 秒后延遲函數調用構造函數的 declare 方法, 此時執行函數 declare 中的 this 指向 Window 。打印的結果如下:

// Window {parent: Window, postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, …}// this is a beautiful flower with 100 petals

2 秒后延遲函數調用構造函數的 declare 方法,此時執行函數 declare 通過 bind 將 this(構造函數的原型對象)綁定。打印的結果如下:

// 注意,此時petalNum的值時隨機取的。// Flower {petalNum: 7}// this is a beautiful flower with 7 petals

這里將 bind換 成 call,apply 會導致立即執行,延遲效果會失效。

ES6的箭頭函數更改this指向

箭頭函數中的 this 是在定義函數的時候綁定,而不是在執行函數的時候綁定。 所謂定義時候綁定,就是指 this 是繼承自父執行上下文的 this。

var a = 1;var obj = { a: 2, f1: function(){ console.log(this.a) }, f2: () => { console.log(this.a) }}obj.f1(); // 2obj.f2(); // 1

obj.f1() 執行后打印的是 2,這里好理解,obj 調用 f1 函數,那么函數中的 this 就指向調用對象 obj。可以看出,這里 this 是在執行函數的時候綁定的。

obj.f2() 執行后打印的是 1。f2 是箭頭函數,那么函數中的 this 是繼承自父執行上下文的 this。這里箭頭函數的父級是對象 obj,obj 的執行上下文就是全局對象 Window,那么箭頭函數中的 this 就指向了全局對象了。

再看一個例子:

var a = 11;function test() { this.a = 22; let b = () => { console.log(this.a) } b();}test(); // 22

按著定義的理解,應該打印出 11 才對呀,因為箭頭函數父級的執行上下文就是 Window 全局對象,此時打印的是全局對象的 a。

先不要著急,先慢慢分析,上面的分析是對的,箭頭函數的 this 就是指向 Window 對象。test 函數在全局環境下調用時其內部的 this 就指向了全局 Window 對象,代碼中的 this.a = 22;就將全局中的 a 重新賦值了,所以箭頭函數在全局對象中找到的 a 值就是 22。我們可以在控制臺上輸入 window.a 查看全局對象中的 a 值,結果打印 22,所以我們就不難理解箭頭函數中打印的結果為什么是 22 了。如果將代碼中的 this.a = 22; 修改為 var a = 22;,那么箭頭函數中打印的結果就是 11 了。

箭頭函數會繼承外層函數調用的 this 綁定,這和 var self = this;的綁定機制一樣。箭頭函數中,this 指向固定化,箭頭函數根本就沒有自己的 this, 所以也就不能用作構造函數使用了。

到此這篇關于淺談JavaScript中this的指向更改的文章就介紹到這了,更多相關JavaScript中this指向更改內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费高潮视频95在线观看网站| 日韩三级精品| 国产精区一区二区| 日欧美一区二区| 日韩欧美中文在线观看| 日韩1区2区3区| 日韩精品视频中文字幕| 日韩国产欧美在线播放| 欧美精品国产白浆久久久久| 日本视频一区二区| 欧美日韩18| 国产精品99久久免费观看| 国产精品igao视频网网址不卡日韩| 国产精品色婷婷在线观看| 国产精品国码视频| 国产亚洲人成a在线v网站| 国产精品综合色区在线观看| 麻豆国产精品视频| 色一区二区三区| 青青国产精品| 午夜久久福利| 国内揄拍国内精品久久| 国产日产精品_国产精品毛片| 国产欧美丝祙| 国产一区二区三区不卡视频网站 | 免费av一区二区三区四区| 免费观看久久av| 亚洲主播在线| 日韩av在线免费观看不卡| 免费视频一区二区三区在线观看| 日韩a一区二区| 日本综合字幕| 亚洲激情二区| 青草av.久久免费一区| 国产日本亚洲| 丁香六月综合| 免费在线欧美视频| 欧美激情网址| 国产+成+人+亚洲欧洲在线| 久久久国产亚洲精品| 免播放器亚洲一区| 国产精品sm| 狠狠操综合网| 国产丝袜一区| 久久久久久免费视频| 日韩精品视频中文字幕| 在线看片国产福利你懂的| 丝袜美腿亚洲一区二区图片| 欧美在线看片| 亚洲a在线视频| 日韩av资源网| 人人精品亚洲| 欧美日韩午夜电影网| 里番精品3d一二三区| 少妇精品导航| 日本麻豆一区二区三区视频| 粉嫩av一区二区三区四区五区| 好看不卡的中文字幕| 国产精品久久久免费| 亚洲精品1区2区| 国产精品亚洲综合色区韩国| 99精品美女| 国产高清精品二区| 免费在线观看视频一区| 91亚洲一区| 婷婷精品在线观看| 神马午夜久久| 久久不卡日韩美女| 久久中文亚洲字幕| 日韩av中文字幕一区二区三区| 精品国产第一福利网站| 日韩av黄色在线| 亚洲高清成人| 国产日产精品_国产精品毛片 | 国产精品1区| 在线视频精品| 97精品一区二区| 日韩av在线免费观看不卡| 日韩电影二区| 欧美久久一区二区三区| 国产午夜久久| 国产成人精品免费视| 日韩av黄色在线| 国产精品视区| av亚洲一区二区三区| 久久av中文| 婷婷五月色综合香五月| 亚洲www啪成人一区二区| 久久精品国产网站| 久久精品导航| 久久99国产精品视频| 日韩国产在线观看| 午夜久久黄色| 国产精品伊人| 激情偷拍久久| 精品国产一区二| 日本aⅴ精品一区二区三区| 在线综合亚洲| 久久久久久久久久久妇女| 精品99在线| 国产欧美日韩影院| 亚洲欧美日本日韩| 成人午夜网址| 国产精品久久777777毛茸茸| 亚洲久久视频| 日韩精品一级中文字幕精品视频免费观看| 久久精品国内一区二区三区水蜜桃| 国产精品极品| 日欧美一区二区| 亚洲精品在线国产| 蜜臀a∨国产成人精品| 亚洲精品a级片| 久久麻豆精品| 久久天堂精品| 欧美成人基地| 久久久久美女| 99久久婷婷| 国产成人精品一区二区三区在线| 国产欧美午夜| 欧美激情日韩| 精品视频在线你懂得| 美日韩一区二区三区| 欧美xxxx性| 美女久久久久久 | 欧美日韩国产亚洲一区| 亚洲欧洲高清| 日本欧美一区二区| 亚洲精品免费观看| 亚洲开心激情| 黄色亚洲免费| 亚洲激情中文| 日韩中文字幕一区二区三区| 蜜臀91精品一区二区三区| 免费不卡在线视频| 蜜臀国产一区二区三区在线播放| 欧美精品自拍| 在线视频亚洲欧美中文| 综合一区二区三区| 欧美一级二级三级视频| 国产精品一区二区三区av| 欧美激情久久久久久久久久久| 国产欧美亚洲精品a| 美女视频黄 久久| 最新中文字幕在线播放| 999国产精品视频| 99香蕉国产精品偷在线观看| 国产精品xxx| 欧美国产91| 国产精品色网| 日韩二区三区在线观看| 欧美国产亚洲精品| 91亚洲国产| 五月天综合网站| 亚洲香蕉视频| 日韩一区二区三区免费视频| 国产午夜久久av| 97在线精品| 国产精品对白久久久久粗| 成人日韩精品| 丝袜国产日韩另类美女| 日韩一区二区三区四区五区| 国产精品久久久久久模特 | 精品一区二区三区中文字幕在线| 日韩久久视频| 久久午夜精品| 国产精品一区三区在线观看| 韩国久久久久久| 亚洲欧洲一区| 首页国产欧美久久| 国产精品中文字幕亚洲欧美| 国产精品99一区二区三| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 天堂va在线高清一区| 精品美女在线视频| 国产亚洲一区在线| 国产精品4hu.www| 久久精品观看| 日本少妇一区二区| 久久精品观看| 日韩av电影一区| 不卡福利视频| 亚洲精品自拍| 免费一级欧美在线观看视频| 九一精品国产| 国产精品久久久久久妇女 | 婷婷五月色综合香五月| 国产成人在线中文字幕| 一区二区三区网站| 久久毛片亚洲| 日本麻豆一区二区三区视频| 日韩啪啪电影网| 日韩三级精品| 精品捆绑调教一区二区三区| 亚洲免费毛片| 日韩国产一区| 日韩国产欧美三级| 欧美亚洲日本精品| 91精品啪在线观看国产爱臀| 亚洲欧美日韩高清在线| 另类欧美日韩国产在线|