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

首頁 > 編程 > JavaScript > 正文

JavaScript中this的四個綁定規則總結

2019-11-20 08:52:52
字體:
來源:轉載
供稿:網友

前言

如果要問javascript中哪兩個知識點容易混淆,作用域查詢和this機制絕對名列前茅。所以這篇文章開始將介紹javascript中this的四個綁定規則,下面來一起看看吧。

綁定規則

1. 默認綁定

獨立函數調用時,this 指向全局對象,如果使用嚴格模式,那么全局對象無法使用默認綁定, this綁定至 undefined。

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

嚴格模式時:

function foo() { "use strict"; console,log(this.a);}var a = 2;foo(); // TypeError: this is undefined

2. 隱式綁定

當函數引用有上下文對象時(即函數作為引用屬性被添加到對象中),隱式綁定規則會把函數調用中的 this 綁定到這個上下文對象。

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

對象屬性引用鏈中只有最頂層或者說最后一層會影響調用位置:

obj1.obj2.foo(); // foo 中的 this 與 obj2 綁定

2.1 隱式丟失

隱式丟失指的是函數中的 this 丟失綁定對象,即它會應用第 1 條的默認綁定規則,從而將 this 綁定到全局對象或者 undefined 上,取決于是否在嚴格模式下運行。以下情況會發生隱式丟失:

綁定至上下文對象的函數被賦值給一個新的函數,然后調用這個新的函數時:

function foo() { console.log( this.a);}var obj = { a: 2, foo: foo};var bar = obj.foo; //函數別名var a = "這是全局變量喔";bar(); // "這是全局變量喔"

傳入回調函數時:

function foo() { console.log( this.a);}function doFoo(fn) { fn(); // <-- 調用位置}var obj = { a: 2, foo: foo};var a = "這是全局變量喔";doFoo( obj.foo ); // "這是全局變量喔"

其實這就是第一種情況的變種,實際上參數傳遞就是一種隱式賦值。除了開發人員自定義的函數,在將函數傳入語言內置的函數比如 setTimeout 時,同樣會發生隱式丟失的情況。

3. 顯式綁定

顯式綁定的核心是 JavaScript 內置的 call(..) apply(..) 方法,這兩個方法在 JavaScript 提供的絕大多數函數以及開發者自己創建的所有函數上都可以使用。

call(..) apply(..)的第一個參數是一個對象(二者區別在后面傳入的參數形式,這里不是重點,不討論),他們會將 this 綁定到這個對象上。因為你可以直接指定 this 綁定的對象,所以這條規則被稱為顯式綁定。

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

如果 call 或者 apply 傳入的第一個參數是原始值(字符串類型、布爾類型或者數字類型),那么該原始值會被轉換成它的對象形式(new String() 、new Boolean() new Number() ),俗稱“裝箱”。

顯式綁定仍然無法解決丟失綁定問題。

3.1 硬綁定

作為顯式綁定的一個變種,硬綁定可以解決丟失綁定問題。

function foo() { console.log( this.a);}var obj = { a: 2};var bar = function() { foo.call(obj);};bar(); // 2setTimeout(bar, 100); // 2bar.call(window); //無效,硬綁定的 bar 不會再修改它的 this

在一個新的函數內部強制綁定 this 到某個對象上,無論之后如何調用這個新的函數,其 this 都不會丟失。

典型應用場景為創建一個包裹函數,傳入所有的參數并返回接收到的所有值:

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

或者將綁定的對象改為可配置,這樣就成了一個輔助綁定函數:

...function bind(fn, obj){ return function(){ return fn.apply(obj, arguments); };}...

由于硬綁定實在太過常見,所以 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 3console.log(b); // 5

3.2 API 調用的“上下文”

JavaScript 自身以及許多第三方庫的函數都提供了一個可選的參數,通常被稱為“上下文”,其作用和 bind(..) 一樣,確保回調函數使用指定的 this。

function foo(el) { console.log( el, this.id);}var obj = { id: "awsome"};//調用 foo(..) 時把 this 綁定到 obj[1,2,3].forEach(foo, obj);// 1 awsome 2 awsome 3 awsome

實際上這些函數背后還是調用了 call() 或者 apply() ,只不過這樣開發者需要寫的代碼就少了一些。

4. new 綁定

使用 new 來調用函數時,會自動執行下面的操作:

     1、創建一個全新的對象

     2、這個新對象會被執行 [[原型]] 連接

     3、這個新對象會綁定到函數調用的 this

     4、如果函數沒有返回其他對象,那么 new 表達式中的函數調用會自動返回這個新對象

舉例如下:

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

使用 new 來調用 foo(..) 時,會構造一個新對象并把它綁定到 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();

綁定例外

如果把 null 或者 undefined 作為 this 的綁定對象傳入 callapply 或者 bind,那么這些值在調用時會被忽略,實際應用的是默認綁定規則。(書中推薦使用一個空對象來綁定 this)。

間接引用。這種情況容易在賦值時發生:

function foo() { console.log( this.a);}var a = 2;var o = {a: 3, foo: foo};var p = {a: 4};o.foo(); // 3(p.foo = o.foo)(); // 2

p.foo() 實際上引用了 foo() ,如此,會應用默認綁定。

另外ES6 對改變 this 的混亂綁定作了相應的努力,誕生了箭頭函數,其根據當前詞法作用域來決定 this 而非上面的四條規則,具體來說,箭頭函數會繼承外層函數調用的 this 綁定(這其實和 ES6 之前代碼中的 self = this 是一個道理)。

總結

以上就是這篇文章的全部內容,希望能對大家的學習或者工作帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线视频美女| 国产精品福利在线| 欧美美女18p| 北条麻妃99精品青青久久| 国产三级精品网站| 亚洲精品999| 2019中文字幕全在线观看| 亚洲精品自产拍| 日韩毛片中文字幕| 海角国产乱辈乱精品视频| 97久久精品人人澡人人爽缅北| 亚洲一区二区中文| 欧美大尺度在线观看| 国产色婷婷国产综合在线理论片a| 国产精品视频内| 久久精品国产欧美激情| 欧美日韩成人免费| 久久av中文字幕| 高潮白浆女日韩av免费看| 疯狂做受xxxx欧美肥白少妇| y97精品国产97久久久久久| 欧美国产日韩中文字幕在线| 欧美中文在线免费| 亚洲精品一区二区网址| 伊人久久久久久久久久久| 欧美视频专区一二在线观看| 亚洲国产精品成人av| 97碰碰碰免费色视频| 国产噜噜噜噜久久久久久久久| 国产精品96久久久久久又黄又硬| 久久91精品国产91久久跳| 怡红院精品视频| 精品久久在线播放| 国产成人亚洲精品| 国产精品成人久久久久| 日韩欧美aⅴ综合网站发布| 日本韩国欧美精品大片卡二| 国产成人在线视频| 亚洲国产天堂久久综合| 亚洲精品视频免费| 日韩成人av一区| 一区二区三区四区精品| 海角国产乱辈乱精品视频| 亚洲国产精品资源| 亚洲视频欧美视频| 97香蕉久久超级碰碰高清版| 国产成人精品av在线| 日韩美女写真福利在线观看| 97视频在线观看网址| 亚洲欧美中文日韩在线| 国产精品成人一区二区| 日韩av中文字幕在线| 国产精品一区二区3区| 欧美激情精品久久久久久大尺度| 最近2019中文字幕在线高清| 国产精品久久久久久久9999| 奇门遁甲1982国语版免费观看高清| 亚洲欧洲午夜一线一品| 成人激情在线观看| 国产精品久久久精品| 中文字幕亚洲激情| 欧美色视频日本版| 亚洲欧美激情精品一区二区| 亚洲精品色婷婷福利天堂| 日韩欧美国产中文字幕| www.99久久热国产日韩欧美.com| 日韩av色综合| 两个人的视频www国产精品| 精品国产乱码久久久久久虫虫漫画| 91中文字幕在线观看| 色樱桃影院亚洲精品影院| 久久成人18免费网站| 亚洲香蕉av在线一区二区三区| 日韩电影中文 亚洲精品乱码| 在线视频欧美日韩精品| 日韩在线观看高清| 国产精品你懂得| 精品国内亚洲在观看18黄| 另类少妇人与禽zozz0性伦| 国产精品永久免费| 亚洲二区在线播放视频| 久久久久国色av免费观看性色| 欧美日韩国产精品一区二区三区四区| 色综合视频一区中文字幕| 午夜精品久久久久久99热软件| 日韩欧美中文字幕在线观看| 中文字幕国产亚洲| 美女精品视频一区| 欧美一区二区三区精品电影| 日本欧美黄网站| 一本一本久久a久久精品综合小说| 日韩在线视频导航| 亚洲男女自偷自拍图片另类| 欧美亚洲视频在线观看| 6080yy精品一区二区三区| 欧洲日韩成人av| 一本色道久久88综合日韩精品| 午夜精品久久久久久久久久久久久| 66m—66摸成人免费视频| 动漫精品一区二区| 亚洲国产美女久久久久| 国产精自产拍久久久久久| 亚洲天天在线日亚洲洲精| 日韩乱码在线视频| 成人激情视频小说免费下载| 按摩亚洲人久久| 日韩在线中文视频| 久久久视频免费观看| 国产成人精品免高潮费视频| 欧美另类xxx| 精品久久久久国产| 久久精品青青大伊人av| 国产亚洲视频在线观看| 久久精品免费电影| 国产在线视频2019最新视频| 国产精品香蕉在线观看| 97视频在线观看免费| 一区二区欧美激情| 亚洲成人激情视频| 日韩欧美成人精品| 亚洲www永久成人夜色| 中文字幕日韩综合av| 91夜夜未满十八勿入爽爽影院| 91精品视频一区| 国产欧亚日韩视频| 欧美日韩性视频| 国产一区二区三区久久精品| 久久精品91久久久久久再现| 日韩大片免费观看视频播放| 欧美香蕉大胸在线视频观看| 色综合久综合久久综合久鬼88| 国产日韩在线亚洲字幕中文| 亚洲精品欧美极品| 一区二区三区回区在观看免费视频| 中文字幕欧美日韩在线| 国产精品丝袜一区二区三区| 人人做人人澡人人爽欧美| 综合136福利视频在线| 在线视频亚洲欧美| 亚洲第一天堂无码专区| 97av在线播放| 精品一区二区电影| 日韩视频―中文字幕| 国产精品1区2区在线观看| 亚洲午夜国产成人av电影男同| 国产精品www| 亚洲综合国产精品| 国产精品色午夜在线观看| 亚洲三级黄色在线观看| 国产日产欧美a一级在线| www高清在线视频日韩欧美| 日韩成人黄色av| 欧美体内谢she精2性欧美| 亚洲丝袜在线视频| 日韩精品一二三四区| 欧美亚洲国产日本| 精品国产31久久久久久| 国产v综合ⅴ日韩v欧美大片| 国产精品网站视频| 日韩在线播放一区| 中文字幕日韩电影| 九九综合九九综合| 欧美激情视频播放| 国产精品日韩专区|