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

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 11:34:54
字體:
來源:轉載
供稿:網友

前言

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() 這個對象

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

判斷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()

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国产三级国产专播精品人| 欧美肥臀大乳一区二区免费视频| 日韩精品免费在线观看| 日韩精品视频三区| 欧洲中文字幕国产精品| 欧美日韩国产页| 亚洲欧美在线播放| 欧美日本亚洲视频| 久久精品国产成人| 亚洲美女av在线播放| 欧美激情精品久久久久久久变态| 欧美激情在线有限公司| 亚洲精品免费一区二区三区| 免费97视频在线精品国自产拍| 日韩高清不卡av| 亚洲成人精品视频在线观看| 欧美性做爰毛片| 琪琪亚洲精品午夜在线| 91成人国产在线观看| 国产成人拍精品视频午夜网站| 精品久久久久久中文字幕一区奶水| 7777免费精品视频| 精品日本高清在线播放| 92国产精品视频| 欧美日韩美女在线观看| 久热精品视频在线免费观看| 日韩av在线资源| 国产在线精品一区免费香蕉| 日韩在线小视频| 亚洲电影免费观看高清完整版在线| 精品中文字幕视频| 成人av在线网址| 麻豆乱码国产一区二区三区| 国产日韩精品电影| 国产欧美日韩精品丝袜高跟鞋| 播播国产欧美激情| 久久久久久久久久久成人| 亚洲成色777777在线观看影院| 欧美日韩裸体免费视频| 欧美视频一二三| 久久这里有精品视频| 国产精品精品一区二区三区午夜版| 久久久999精品视频| 国产精品高潮视频| 欧美成人精品三级在线观看| 国产一区二区激情| 欧美最顶级的aⅴ艳星| 亚洲国产一区二区三区四区| 欧美专区日韩视频| 国产成人91久久精品| 欧美大片大片在线播放| 色噜噜亚洲精品中文字幕| 欧美猛男性生活免费| 国产久一一精品| 欧美电影《睫毛膏》| 国产日韩欧美一二三区| 欧美裸体视频网站| 欧美激情一区二区三级高清视频| 欧美成人自拍视频| 亚洲第一天堂av| 91黑丝在线观看| 国产欧美一区二区三区久久人妖| 国产午夜精品视频免费不卡69堂| 国产69久久精品成人看| 日本一区二区在线播放| 亚洲丁香婷深爱综合| 亚洲成人av在线播放| 亚洲新中文字幕| 日韩亚洲欧美成人| 亚洲色图av在线| 亚洲在线视频福利| 色偷偷av一区二区三区乱| 国产精品美女主播在线观看纯欲| 国产精品女视频| 成人网页在线免费观看| 午夜精品久久久久久久99热浪潮| 一区二区成人av| 中文字幕亚洲一区二区三区五十路| 欧美日韩另类视频| 疯狂欧美牲乱大交777| 亚洲欧洲在线看| 在线日韩av观看| 日韩中文字幕亚洲| 人人澡人人澡人人看欧美| 亚洲人午夜精品免费| 日本一区二区三区在线播放| 日韩av大片免费看| 国产一区二区在线播放| 中文字幕亚洲一区二区三区| 大荫蒂欧美视频另类xxxx| 日韩电影网在线| 日韩中文在线中文网三级| 欧美在线一级视频| 亚洲一区二区黄| 亚洲free性xxxx护士hd| 一本色道久久88综合日韩精品| 色老头一区二区三区在线观看| 欧美一性一乱一交一视频| 精品动漫一区二区三区| 欧美性xxxxx| 色av吧综合网| 久久国产精品电影| 欧美日韩在线视频首页| 奇米四色中文综合久久| 成人h视频在线观看播放| 久久精品中文字幕电影| 国产日韩视频在线观看| 亚洲欧美中文日韩在线| 爱福利视频一区| 久久久久女教师免费一区| 国产69精品久久久| 91美女片黄在线观| 91中文在线视频| 欧美成人午夜免费视在线看片| 在线日韩av观看| 亚洲国产91色在线| 91精品国产高清久久久久久久久| 国产精品96久久久久久又黄又硬| 久久精品国产一区二区三区| 黄色成人av网| 欧美高清激情视频| 久久精品国产v日韩v亚洲| 欧美激情一区二区久久久| 日本欧美中文字幕| 国产不卡av在线| 欧美日韩在线免费观看| 欧美又大粗又爽又黄大片视频| 国产日韩欧美影视| 91中文精品字幕在线视频| 欧美日韩免费一区| 国产精品吹潮在线观看| 中文字幕日韩av电影| 国产欧美日韩视频| 欧美黑人极品猛少妇色xxxxx| 精品国产自在精品国产浪潮| 欧美另类xxx| 欧美猛少妇色xxxxx| 成人精品aaaa网站| 国产精品大片wwwwww| 国产精品国产三级国产aⅴ浪潮| 国产精品欧美日韩一区二区| 法国裸体一区二区| 日韩欧美一区二区三区久久| 亚洲视频专区在线| 国产丝袜一区视频在线观看| 欧美日韩电影在线观看| 91精品国产91| 国产主播喷水一区二区| 热99精品里视频精品| 久久夜色精品国产亚洲aⅴ| 6080yy精品一区二区三区| 久久99久久99精品中文字幕| 蜜臀久久99精品久久久无需会员| 久久久国产精品亚洲一区| 一本久久综合亚洲鲁鲁| 国产精品一区二区三区免费视频| 在线国产精品播放| 色综合久久88| 日韩一区视频在线| 亚洲欧洲午夜一线一品| 国内精品久久久久影院 日本资源| 成人97在线观看视频| 亚洲福利视频免费观看| 午夜精品久久久久久久男人的天堂|