亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript中this的全面解析及常見實例

2024-05-06 16:50:53
字體:
來源:轉載
供稿:網友

前言

this 關鍵字在 Javascript 中非常常見,但是很多開發者很難說清它到底指向什么。大部分人會從字面意思上去理解 this,認為 this 指向函數自身,實際上this 是在運行時進行綁定的,并不是在編寫時綁定,它的上下文取決于函數調
用時的各種條件。this 的綁定和函數聲明的位置沒有任何關系,只取決于函數的調用方式。

總結: 函數被調用時發生 this 綁定,this 指向什么完全取決于函數在哪里被調用。

一、this 的綁定規則

this 一共有 4 中綁定規則,接下來一一介紹每種規則的解釋和規則直接的優先級

  • 默認綁定(嚴格/非嚴格模式)
  • 隱式綁定
  • 顯式綁定
  • new 綁定

1.1 默認綁定(嚴格/非嚴格模式)

  • 獨立函數調用: 獨立函數調用時 this 使用默認綁定規則,默認綁定規則下 this 指向 window(全局對象)。
  • 嚴格模式下: this 無法使用默認綁定,this 會綁定到 undefined。

獨立函數調用

function foo() { console.log(this.a);}var a = 2;foo(); // 2

嚴格模式下:

function foo() { "use strict"; console.log(this); //undefined console.log(this.a); //Uncaught TypeError: Cannot read property 'a' of undefined}var a = 2;foo();

注意下邊兩種情況

var age = "18";var obj = { name: "heyushuo", age: 25, fn: function() { function sayName() {  console.log(this); //window  console.log(this.age); //undefined } sayName(); }};obj.fn();

函數 sayName 雖然是在 obj.fn 內部定義的,但是它仍然是一個獨立函數調用,this 仍然指向 window。

var a = "global";var obj = { a: 2, foo: function() { console.log(this.a); //global }};var bar = obj.foo; // 函數別名!bar();

雖然 bar 是 obj.foo 的一個引用,但是實際上,它引用的是函數本身,因此此時的
bar() 其實是一個不帶任何修飾的獨立函數調用,因此應用了默認綁定。

1.2 隱式綁定

當函數引用有上下文對象時(例如:obj.foo 這個時候使用 obj 上下文來引用函數 foo),隱式綁定規則會把函數中的 this 綁定到這個上下文對象。

var obj = { name: "heyushuo, foo: function() { console.log(this.name); //heyushuo }};obj.foo();

對象屬性引用鏈中只有上一層或者說最后一層在調用中起作用。

var obj = { name: "heyushuo", obj1: { name: "kebi", foo: function() {  console.log(this.name); // kebi } }};obj.obj1.foo();

隱式丟失

被隱式綁定的函數會丟失綁定對象,而應用默認綁定,把 this 綁定到全局對象或者 undefined(嚴格模式) 上。

第一種

var a = "global";var obj = { a: 2, foo: function() { console.log(this.a); //global }};var bar = obj.foo; // 函數別名!bar();

雖然 bar 是 obj.foo 的一個引用,但是實際上,它引用的是函數本身,因此此時的bar() 其實是一個不帶任何修飾的獨立函數調用,因此應用了默認綁定。

第二種傳入回調函數時:

var a = "global";var obj = { a: 2, foo: function() { console.log(this.a); //global }};var bar = obj.foo; // 函數別名!function doFoo(fn) { fn(); // <-- 調用位置!}doFoo(bar); //global//和下邊這種一樣setTimeout(obj.foo, 300);

1.3 顯示綁定

通過 call() 或者 apply()方法。第一個參數是一個對象,在調用函數時將這個對象綁定到 this 上,稱之為顯示綁定。

function foo() { console.log(this.a);}var obj = { a: 2};foo.call(obj); // 2

顯示綁定引申出來一個硬綁定,代碼如下

function foo(something) {  console.log( this.a, something );  return this.a + something;}// 簡單的輔助綁定函數function bind(fn, obj) {  return function() { return fn.apply( obj, arguments ); //內部已經強制綁定了傳入函數this的指向 };}var obj = {  a:2};var bar = bind( foo, obj ); var b = bar( 3 ); // 2 3console.log( b ); // 5

bar函數無論如何調用,它總會手動在 obj 上調用 fn,強制把 fn 的 this 綁定到了 obj。這樣也解決前面提到的丟失綁定問題
由于硬綁定是一種非常常用的模式,所以在 ES5 中提供了內置的方法 Function.prototype.bind

function foo(something) {  console.log( this.a, something );  return this.a + something;}var obj = {  a:2};var bar = foo.bind( obj );var b = bar( 3 ); // 2 3 console.log( b ); // 5

1.4 new綁定

使用new來調用函數,或者說發生構造函數調用時,會自動執行下面的操作。

  • 創建(或者說構造)一個全新的對象。
  • 這個新對象會被執行 [[ 原型 ]] 連接。
  • 這個新對象會綁定到函數調用的 this。
  • 如果函數沒有返回其他對象,那么 new 表達式中的函數調用會自動返回這個新對象。

例如:

function foo() {  this.name = "heyushuo"; this.age = 25} foo.prototype.sayName = function(){ console.log(this.name+this.age);}var bar = new foo();console.log(bar); //{name: "heyushuo", age: 25}//這個新對象會綁定到函數調用的 this。所以此時的this就是bar對象console.log( bar.age ); // 25

如下圖是 new foo() 這個對象

JavaScript,this,全面解析

二、四種綁定關系的優先級

判斷this,可以按照下面的順序來進行判斷:

1、函數是否在 new 中調用(new 綁定)?如果是的話 this 綁定的是新創建的對象。

var bar = new foo()

2、函數是否通過 call、apply(顯式綁定)或者硬綁定調用?如果是的話,this 綁定的是指定的對象。

var bar = foo.call(obj2)

3、函數是否在某個上下文對象中調用(隱式綁定)?如果是的話,this 綁定的是那個上下文對象。

var bar = obj1.foo()

4、如果都不是的話,使用默認綁定。如果在嚴格模式下,就綁定到 undefined,否則綁定到全局對象。

var bar = foo()

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线一区二区| 国产精品一区二区av影院萌芽| 欧美另类第一页| 国产有码一区二区| 成人福利在线观看| 91国内免费在线视频| 日本一区二区三区四区视频| 青草成人免费视频| 国产成人在线精品| 91热福利电影| 国产亚洲精品一区二区| 国产精品88a∨| 国产一区香蕉久久| 日韩精品视频免费在线观看| 国产性色av一区二区| 国产情人节一区| 中文字幕日本精品| 日韩小视频在线观看| 亚洲乱码一区av黑人高潮| 欧美区二区三区| 中文字幕国产精品久久| 亚洲天天在线日亚洲洲精| 成人a免费视频| 亚洲免费av电影| 亚洲毛片在线观看| 欧美丝袜一区二区三区| 国产精品亚洲аv天堂网| 疯狂做受xxxx欧美肥白少妇| 搡老女人一区二区三区视频tv| 欧美日韩另类在线| 日韩欧美综合在线视频| 日本不卡视频在线播放| 黑人巨大精品欧美一区二区一视频| 日韩亚洲欧美中文在线| 亚洲欧洲自拍偷拍| 国产婷婷97碰碰久久人人蜜臀| 亚洲日本中文字幕免费在线不卡| 日韩精品黄色网| 国产综合香蕉五月婷在线| 国内揄拍国内精品| 欧美人与性动交| 日韩av电影在线免费播放| 日韩成人激情影院| …久久精品99久久香蕉国产| 亚洲欧洲在线视频| 国产综合在线观看视频| 亚洲一区二区免费| 亚洲精品午夜精品| 青草热久免费精品视频| 精品一区二区电影| 8x海外华人永久免费日韩内陆视频| 亚洲综合精品伊人久久| 91香蕉嫩草影院入口| 欧美日在线观看| 日韩av资源在线播放| 欧美夫妻性生活xx| 欧美国产亚洲视频| 日韩小视频在线| 日产精品久久久一区二区福利| 国产亚洲精品综合一区91| 中文国产亚洲喷潮| 亚洲一区二区日本| 日韩在线观看免费| 97精品一区二区三区| 欧美一区二区大胆人体摄影专业网站| 在线电影av不卡网址| 成人美女av在线直播| 亚洲人成免费电影| 97超碰国产精品女人人人爽| 美女999久久久精品视频| 亚洲精品久久7777777| 亚洲韩国欧洲国产日产av| 久久精品视频在线播放| 欧美疯狂做受xxxx高潮| 国产欧洲精品视频| 亚洲国产精品高清久久久| 成人精品一区二区三区电影黑人| 欧美在线视频免费观看| 中文字幕在线亚洲| 久久久人成影片一区二区三区| 亚洲黄在线观看| 欧美性理论片在线观看片免费| 日韩免费观看网站| 亚洲精品国产suv| 欧美片一区二区三区| 岛国av在线不卡| 91精品国产99久久久久久| 国产综合久久久久久| 国产亚洲精品久久久久久| 日韩亚洲精品电影| 国产精品久久久久福利| 色噜噜久久综合伊人一本| 成人天堂噜噜噜| 欧美色xxxx| 日韩精品在线视频| 欧美一区二区三区免费观看| 亚洲在线观看视频网站| 成人精品网站在线观看| 福利视频一区二区| 成人久久一区二区| 欧美一级黑人aaaaaaa做受| 欧美视频在线免费看| 4438全国亚洲精品在线观看视频| 久久国产色av| 国产精品日韩av| 影音先锋日韩有码| 日韩美女在线观看一区| 亚洲的天堂在线中文字幕| 色婷婷av一区二区三区久久| 久久久久久久久久久91| 久久精品亚洲精品| 91久久精品久久国产性色也91| 国产精品丝袜白浆摸在线| 91夜夜揉人人捏人人添红杏| 成人信息集中地欧美| 久久精品国产免费观看| 国产91av在线| 色偷偷噜噜噜亚洲男人| 夜夜躁日日躁狠狠久久88av| 亚洲天堂男人的天堂| 午夜精品www| 国内精品小视频| 日本久久久久亚洲中字幕| 黑人巨大精品欧美一区二区| 久久久久久久亚洲精品| 久久综合久久88| 亚洲人在线视频| 国产免费一区二区三区在线能观看| 亚洲成人a级网| 91精品视频观看| 欧美大尺度在线观看| 亚洲性猛交xxxxwww| 久久精品久久久久久国产 免费| 奇米影视亚洲狠狠色| 久久精品中文字幕电影| 中文字幕无线精品亚洲乱码一区| 欧美性猛交xxxx黑人| 中文字幕精品—区二区| 日韩女在线观看| 日韩欧美视频一区二区三区| 欧美激情一区二区三区久久久| 亚洲男人第一av网站| 国产不卡av在线免费观看| 成人免费在线视频网址| 久久久成人精品视频| 成人xvideos免费视频| 91爱视频在线| 色噜噜亚洲精品中文字幕| 成人网在线免费观看| 国产一区二区色| 91免费看片在线| 欧美大片在线免费观看| 欧美一级片在线播放| 国产精品久久久久久久久借妻| 日韩精品极品视频| 国产91精品久久久| 亚洲天堂男人天堂女人天堂| 777国产偷窥盗摄精品视频| 久久偷看各类女兵18女厕嘘嘘| 国产精品视频资源| 成人欧美一区二区三区黑人| 中文字幕亚洲情99在线| 欧美一级高清免费播放| 精品视频久久久久久|