最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談JavaScript中this的指向更改

 更新時間:2020年07月28日 11:57:37   作者:老甄Home  
這篇文章主要介紹了淺談JavaScript中this的指向更改,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

JS中this指向的更改

JavaScript 中 this 的指向問題 前面已經(jīng)總結(jié)過,但在實(shí)際開中, 很多場景都需要改變 this 的指向。 現(xiàn)在我們討論更改 this 指向的問題。

call更改this指向

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

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

// 使用 call 方法改變調(diào)用函數(shù)執(zhí)行上下文的 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小時

當(dāng)直接調(diào)用函數(shù) greet 時,函數(shù) greet 內(nèi)部的 this 指向的是全局對象 Window。

函數(shù) greet 調(diào)用 call() 方法并傳遞對象 dogObj 時,函數(shù) greet 內(nèi)部的 this 就指向了對象 dogObj 。

函數(shù) greet 調(diào)用 call() 方法并傳遞對象 pigObj 時,函數(shù) greet 內(nèi)部的 this 就指向了對象 pigObj 。

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

匿名函數(shù)調(diào)用call方法:

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

call實(shí)現(xiàn)繼承:

// 實(shí)現(xiàn)兩個數(shù)相加的構(gòu)造函數(shù)
function CalcA(){
 this.add = function(a, b){
  return a + b;
 }
}
// 實(shí)現(xiàn)兩個數(shù)相減的構(gòu)造函數(shù)
function CalcS(){
 this.sub = function(a, b){
  return a - b;
 }
}
// 計(jì)算構(gòu)造函數(shù)
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)); // 5
console.log(calc.sub(10, 1));// 9

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

apply方法更改this指向

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

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

bind方法更改this指向

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

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

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();

實(shí)例對象 flower 調(diào)用 bloom 方法后,bloom 內(nèi)的 this 指向構(gòu)造函數(shù)的原型對象。

1 秒后延遲函數(shù)調(diào)用構(gòu)造函數(shù)的 declare 方法, 此時執(zhí)行函數(shù) declare 中的 this 指向 Window 。打印的結(jié)果如下:

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

2 秒后延遲函數(shù)調(diào)用構(gòu)造函數(shù)的 declare 方法,此時執(zhí)行函數(shù) declare 通過 bind 將 this(構(gòu)造函數(shù)的原型對象)綁定。打印的結(jié)果如下:

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

這里將 bind換 成 call,apply 會導(dǎo)致立即執(zhí)行,延遲效果會失效。

ES6的箭頭函數(shù)更改this指向

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

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

obj.f1() 執(zhí)行后打印的是 2,這里好理解,obj 調(diào)用 f1 函數(shù),那么函數(shù)中的 this 就指向調(diào)用對象 obj??梢钥闯?,這里 this 是在執(zhí)行函數(shù)的時候綁定的。

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

再看一個例子:

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

按著定義的理解,應(yīng)該打印出 11 才對呀,因?yàn)榧^函數(shù)父級的執(zhí)行上下文就是 Window 全局對象,此時打印的是全局對象的 a。

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

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

到此這篇關(guān)于淺談JavaScript中this的指向更改的文章就介紹到這了,更多相關(guān)JavaScript中this指向更改內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS上傳圖片前的限制包括(jpg jpg gif及大小高寬)等

    JS上傳圖片前的限制包括(jpg jpg gif及大小高寬)等

    文件上傳之前的檢測,通常是通過文件名來判斷文件類型是否合法,但是要想檢測文件的大小很難辦到,除非在本地或者使用控件。使用JS可以輕松解決詞問題,js在上傳圖片前判斷大小 這個可以用javascript實(shí)現(xiàn),效果
    2012-12-12
  • js從外部獲取圖片的實(shí)現(xiàn)方法

    js從外部獲取圖片的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s從外部獲取圖片的實(shí)現(xiàn)方法。小編覺得挺不錯的, 現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JavaScript優(yōu)化專題之Loading and Execution加載和運(yùn)行

    JavaScript優(yōu)化專題之Loading and Execution加載和運(yùn)行

    這篇文章主要介紹了JavaScript優(yōu)化專題中Loading and Execution加載和運(yùn)行的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 利用JS判斷數(shù)據(jù)類型的四種方法

    利用JS判斷數(shù)據(jù)類型的四種方法

    面試的時候經(jīng)常會問到JS 中 判斷數(shù)據(jù)類型的方法,一般常用的 就是typeof了 ,其他的也想不起來,今天特意在網(wǎng)上查了一下來總結(jié),這篇文章主要介紹了利用JS判斷數(shù)據(jù)類型的四種方法,需要的朋友可以參考下
    2021-08-08
  • 詳解JSON和JSONP劫持以及解決方法

    詳解JSON和JSONP劫持以及解決方法

    這篇文章主要介紹了詳解JSON和JSONP劫持以及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • antd組件Upload實(shí)現(xiàn)自己上傳的實(shí)現(xiàn)示例

    antd組件Upload實(shí)現(xiàn)自己上傳的實(shí)現(xiàn)示例

    這篇文章主要介紹了antd組件Upload實(shí)現(xiàn)自己上傳的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • JS IOS/iPhone的Safari瀏覽器不兼容Javascript中的Date()問題如何解決

    JS IOS/iPhone的Safari瀏覽器不兼容Javascript中的Date()問題如何解決

    這篇文章主要介紹了JS IOS/iPhone的Safari瀏覽器不兼容Javascript中的Date()問題的解決方案,非常不錯,感興趣的朋友參考下吧
    2016-11-11
  • JavaScript用Number方法實(shí)現(xiàn)string轉(zhuǎn)int

    JavaScript用Number方法實(shí)現(xiàn)string轉(zhuǎn)int

    parseInt方法在format'00'開頭的數(shù)字時會當(dāng)作2進(jìn)制轉(zhuǎn)10進(jìn)制,所以建議string轉(zhuǎn)int最好用Number方法
    2014-05-05
  • 頁面載入結(jié)束自動調(diào)用js函數(shù)示例

    頁面載入結(jié)束自動調(diào)用js函數(shù)示例

    當(dāng)頁面加載完成后自動調(diào)用預(yù)先編好的js函數(shù),在某些特殊情況下還是比較實(shí)用的,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下
    2013-09-09
  • JS逆向之?webpack?打包站點(diǎn)實(shí)戰(zhàn)原理分享

    JS逆向之?webpack?打包站點(diǎn)實(shí)戰(zhàn)原理分享

    本文主要介紹了JS逆向之webpack打包站點(diǎn)實(shí)戰(zhàn)原理分享,webpack是前端程序員用來進(jìn)行打包JS的技術(shù),打包之后的代碼特征非常明顯,更多相關(guān)知識需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容
    2022-06-06

最新評論

延庆县| 喀喇| 泗洪县| 黑龙江省| 綦江县| 南投县| 平遥县| 六盘水市| 郴州市| 申扎县| 同江市| 双鸭山市| 岳阳市| 马尔康县| 正宁县| 海原县| 丰县| 绥江县| 会东县| 玛纳斯县| 镇江市| 沈阳市| 萨迦县| 抚州市| 临漳县| 城步| 栖霞市| 南充市| 科技| 寻甸| 泊头市| 正蓝旗| 军事| 鲜城| 西畴县| 金平| 汾西县| 深水埗区| 平定县| 奉节县| 湖口县|