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

首頁 > 開發 > JS > 正文

Javascript的this詳解

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

在理解javascript的this之前,首先先了解一下作用域。

作用域分為兩種:

  1. 1、詞法作用域:引擎在當前作用域或者嵌套的子作用域查找具有名稱標識符的變量。(引擎如何查找和在哪查找。定義過程發生在代碼書寫階段)
  2. 2、動態作用域:在運行時被動態確定的作用域。

詞法作用域和動態作用域的區別是:詞法作用域是在寫代碼或定義時確定的;動態作用域是在運行時確定的。

this的綁定規則

this是在調用時被綁定,取決于函數的調用位置。由此可以知道,一般情況下(非嚴格模式下),this都會根據函數調用(調用棧)的上下文來綁定對象。

一、默認綁定

默認綁定:默認綁定是指在非嚴格模式下,且沒有使用別的綁定規則時,this根據函數調用(調用棧)的上下文來綁定對象(全局對象)。(嚴格模式下則綁定undefined)

舉個栗子:

function foo() {  console.log(this.a);};function bar() {  var a = 3;  foo();}var a = 2;bar(); //調用棧在全局作用域,this綁定全局對象

運行結果為: 2

//加上"use strict"運行結果則會變成this is undefined

這里的函數調用時,使用了默認綁定,函數調用(調用棧)的上下文是全局作用域,因此this綁定了全局對象(global)。

eg2:

function foo() {  console.log(this.a)};var a = 2;(function() {  "use strict"  foo();})();

運行結果為: 2

 這里需要注意:對于默認綁定,決定this綁定對象的不是調用位置是否處于嚴格模式,而是函數體是否處于嚴格模式(函數體處于嚴格模式則this綁定undefined;否則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 = o.foo的返回值是直接引用目標函數foo。

二、隱式綁定

隱式綁定:由上下文對象調用,綁定到上下文對象。

舉個栗子:

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

這段代碼中,foo()被當做引用屬性添加到obj對象中,obj調用這個引用屬性函數時,會使用該引用屬性上下文,this會被綁定到obj對象。(這個函數嚴格來說不屬于obj對象,只是作為引用屬性)。屬于隱式綁定。

而下面foo()函數的直接執行,并不是obj對象引用,所以上下文對象是全局對象。故this綁定了undefined。屬于默認綁定。

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

注意:

1.隱式綁定的函數會丟失綁定對象。此時它會應用默認綁定,將this綁定到全局對象或者undefined上,取決于是否是嚴格模式。

eg:

function foo() {  console.log(this.a);};var obj = {  a: 2;  foo: foo}var bar = obj.foo;var a = 'biubiubiu';bar();

運行結果:"biubiubiu"

解析:看似bar是obj.foo的一個引用,實際上bar是直接引用了函數foo,是一個單純的函數調用,故實為默認綁定。

2.參數傳遞就是隱式賦值,因此傳入函數時也會被隱式賦值。

eg:

function foo() {  console.log(this.a);};var obj = {  a: 2,  foo: foo};function bar(fn) {  fn();};var a = "biubiubiu";bar(obj.foo);

運行結果: "biubiubiu"

解析:實際上參數也是隱式賦值,但是參數傳入函數中,并在函數中執行。此時也是直接引用了函數foo,因此也是單純的函數調用,采用了默認綁定。

3.把函數傳入語言內置函數。(與上面情況基本相似,將自己聲明函數改成語言內置函數)回調函數丟失this的情況比較常見,況且還有調用回調函數的函數可能還會修改this。

三、顯式綁定

顯式綁定:直接將this綁定到指定對象上。Javascript中絕大多數函數和自己所創建的函數都可以使用這兩種顯式綁定的方法。

1、.call()
2、.apply()

這兩種綁定方法,第一個參數是this綁定的對象。(如果傳入的參數是原始值(字符串類型、布爾類型、數字類型),這個原始值就會被轉成對象形式(new String、new Boolean、new Number)這個稱為:裝箱)

舉個栗子:

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

運行結果: 2

 然鵝,顯示綁定并不能解決綁定丟失的問題。這個時候來了一位新朋友 -- 硬綁定(bind)。

3、.bind() (硬綁定是常見場景,故es5提供了該內置方法 Function.prototype.bind。)
bind()會返回一個新編碼函數,把this綁定在指定參數上,并調用函數。

舉個栗子:

function foo(e) {  console.log(this.a + e);  return this.a + e;};var obj = {  a: 2}var bar = foo.bind(obj); //新編碼函數var b = bar(3); // 2 3console.log(b); // 5

bind()還有一個功能:將除了第一個用于綁定this的參數之外的其他參數傳給下層的函數(部分應用,是“柯里化”的一種)。

這里涉及到一個概念:把null或者undefined作為this的綁定對象傳入call、apply、bind,這些值在調用的時候會被忽略,實際應用默認綁定規則。
應用場景:

  1. 1、使用apply()展開一個數組,并作為參數傳遞給一個函數。
  2. 2、bind()對參數進行柯里化(預先設置一些參數)。

舉個栗子:

function foo(a,b) {  console.log("a:" + a + ",b:" + b);};//數組“展開”成參數foo.apply(null,[2,3]); //a:2,b:3//bind()柯里化var bar = foo.bind(null,2);bar(3); //a:2,b:3

解析:傳入一個參數作為this綁定對象,如果不傳則使用占位符(null),此時會使用默認綁定規則。

上面這個例子可能會產生一定的副作用,如果需要運用這種場景并且更加安全??梢詣摻ㄒ粋€空對象(可以用任意喜歡的名字來命名)。

var ∅ = Object.create(null);//上面這個例子就可以改寫為:foo.apply(∅,[2,3]); //a:2,b:3var bar = foo.bind(∅,2);bar(3); //a:2,b:3

注意:硬綁定之后不能使用隱式綁定和顯式綁定對this進行修改
在這里介紹一種軟綁定的方法softBind(),檢查this綁定到全局對象或者undefined后,綁定this到指定的默認對象。綁定后效果和硬綁定一樣,但是保留隱式綁定或者顯式綁定修改this的能力。

四、new綁定

Javascript中的new機制與面向類語言的完全不同。在Javascript中,構造函數只是一些使用new操作符時被調用的函數,不屬于一個類,也不會實例化一個類。稱為對函數的“構造調用”。

舉個栗子:

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

使用new的過程會創建一個全新的對象,this會綁定這個新對象。如果函數沒有返回其他對象,則new表達式函數調用會返回該新對象。(這個新對象會連接prototype)

四種綁定規則的優先級為:new>顯式>隱式>默認

箭頭函數

箭頭函數是根據外層作用域(函數或全局)來決定this。(詞法作用域取代this機制)
箭頭函數this會綁定調用時的對象,且箭頭函數的綁定無法修改(new也不行)。

其實可以理解為,箭頭函數的this在詞法上繼承的是它所在的作用域(函數或全局)的this,而它繼承的函數作用域的this綁定的是在該函數調用上下文對象,所以箭頭函數的this間接的綁定在調用上下文對象。

簡述: 箭頭函數this(綁定作用域this)-- 作用域this(綁定在調用上下文對象)。

故:箭頭函數this == 調用的上下文對象

舉個栗子:

function foo() {  setTimeout(function() {    //這里的this在詞法上繼承自foo()    console.log(this.a);  },100);};var obj = { a: 2 };foo.call(obj); //2

其實這個栗子也等價于:

function foo() {  var that = this; //lexical capture of this  setTimeout(function() {    console.log(self.a)  },100);}...與上面一樣

所以,有兩種風格:this風格(四種規則)和詞法作用域風格(that = this和箭頭函數)可供使用。使用時盡量避免混用,否則會造成難以維護的后果。

以上所述是小編給大家介紹的Javascript的this的作用詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久久在线| 日韩成人在线观看| 欧美乱妇40p| 国语对白做受69| 亚洲伊人久久综合| 日韩中文字幕国产| 一区二区三区高清国产| 欧美国产日本在线| 成人女保姆的销魂服务| 亚洲天堂网在线观看| 久久久久久国产三级电影| wwwwwwww亚洲| 久久久久久久国产精品| 精品丝袜一区二区三区| 久久久精品网站| 国内精品久久久久伊人av| 中文字幕精品在线视频| 久久久久日韩精品久久久男男| 亚洲女人天堂成人av在线| 国产精品国语对白| 国产精彩精品视频| 国模精品一区二区三区色天香| 亚洲欧美中文字幕| 欧美大奶子在线| 国产做受69高潮| 欧美日韩中文字幕| 久久99视频免费| 国产精品久久激情| 欧美国产中文字幕| 中文字幕国产精品久久| 午夜精品一区二区三区av| 美女扒开尿口让男人操亚洲视频网站| 日韩成人高清在线| 日韩高清电影免费观看完整版| 国产精品一区二区三| 97香蕉超级碰碰久久免费软件| 欧美性精品220| 欧美成人高清视频| 亚洲精品国产精品久久清纯直播| 欧美性生交xxxxx久久久| 精品成人乱色一区二区| 26uuu日韩精品一区二区| 麻豆乱码国产一区二区三区| 成人h猎奇视频网站| 国产视频亚洲精品| 国产亚洲精品久久久久久| 国产精品久久不能| 疯狂做受xxxx欧美肥白少妇| 成人在线小视频| 日韩av在线影视| 91在线视频九色| 最好看的2019的中文字幕视频| 一本色道久久88精品综合| 亚洲自拍偷拍网址| 日韩黄色av网站| 久久免费视频在线观看| 欧美第一黄网免费网站| 国产精品久久久久久久久久久久| 国产精品白丝jk喷水视频一区| 91精品视频免费| 久国内精品在线| 国产精品成人在线| 草民午夜欧美限制a级福利片| 日韩福利在线播放| 日韩精品高清在线| 久久的精品视频| 日韩精品在线观看一区二区| 欧美第一黄网免费网站| 国产精品69av| 成人在线国产精品| 5566成人精品视频免费| 欧美刺激性大交免费视频| 久久久久久国产精品美女| 国内精品久久久久久久久| 久久久久久久国产精品视频| 欧美影院成年免费版| 精品一区二区亚洲| 亚洲小视频在线| 国产精品欧美激情| 久久久久久久久久久av| 欧美成人精品影院| 精品国产1区2区| 久久久久久免费精品| 成人精品一区二区三区| 国产欧美精品一区二区三区-老狼| 亚洲免费av片| 国产精品91一区| 国产美女扒开尿口久久久| 欧美在线亚洲在线| 美乳少妇欧美精品| 久久久精品2019中文字幕神马| 亚洲精品一区二区网址| 亚洲综合中文字幕在线观看| 日韩亚洲成人av在线| 久久久国产一区二区三区| 久久久女女女女999久久| 国产深夜精品福利| 午夜精品三级视频福利| 91久久在线播放| 国产精品中文久久久久久久| 国产噜噜噜噜噜久久久久久久久| 91成人精品网站| 国产色视频一区| 国产精品欧美一区二区三区奶水| 亚洲福利视频网| 国产视频在线一区二区| 亚洲精品国产拍免费91在线| 久久夜色精品亚洲噜噜国产mv| 69精品小视频| 在线播放日韩精品| 日韩精品在线观看一区| 成人黄色免费在线观看| 亚洲一区中文字幕| 96sao精品视频在线观看| 亚洲男人天堂网| 久久久久久久久中文字幕| 5278欧美一区二区三区| 亚洲视频欧美视频| 国产精品h在线观看| 欧美成aaa人片免费看| 欧美成人在线免费视频| 日韩高清有码在线| 日韩av一区二区在线| 91久久国产精品| 国产精品久久久久久av福利软件| 日韩av在线电影网| 青草成人免费视频| 亚洲午夜av久久乱码| 欧美精品18videos性欧美| 亚洲最大成人在线| 尤物yw午夜国产精品视频| 国产99久久精品一区二区永久免费| 91精品国产91久久久久久久久| 国产美女精品免费电影| 欧美第一黄网免费网站| 日韩风俗一区 二区| 综合久久五月天| 欧美亚洲成人免费| 亚洲黄色有码视频| 中文字幕亚洲一区二区三区五十路| 国产一区二区三区四区福利| 热久久视久久精品18亚洲精品| 在线观看视频亚洲| 亚洲福利视频免费观看| 色综合久久中文字幕综合网小说| 久久精品国产v日韩v亚洲| 亚洲日韩中文字幕| 日韩视频免费看| 日韩av一卡二卡| 国产亚洲精品久久| 中文字幕欧美在线| 国产一区av在线| 欧美高清激情视频| 亚洲欧美在线一区二区| 亚洲午夜av久久乱码| 成人a级免费视频| 日韩免费av在线| 国产精品稀缺呦系列在线| 欧美一区二区三区免费视| 性欧美激情精品| 国产一区二区三区三区在线观看| 97在线看免费观看视频在线观看| 亚洲精品99久久久久中文字幕| 欧美影院成年免费版|