欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Javascript的this如何使用-創(chuàng)新互聯(lián)

這篇文章主要介紹Javascript的this如何使用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

在廣陵等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網站設計、做網站 網站設計制作按需制作,公司網站建設,企業(yè)網站建設,品牌網站建設,網絡營銷推廣,成都外貿網站建設,廣陵網站建設費用合理。

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

作用域分為兩種:

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

詞法作用域和動態(tài)作用域的區(qū)別是:詞法作用域是在寫代碼或定義時確定的;動態(tài)作用域是在運行時確定的。

this的綁定規(guī)則

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

一、默認綁定

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

舉個栗子:

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

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

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

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

運行結果為: 2

這里需要注意:對于默認綁定,決定this綁定對象的不是調用位置是否處于嚴格模式,而是函數(shù)體是否處于嚴格模式(函數(shù)體處于嚴格模式則this綁定undefined;否則this綁定全局對象)。另外:嚴格模式和非嚴格模式雖然有可能可以綁定,但是最好不混用。

間接引用一般也是會應用默認綁定規(guī)則。

eg:
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的返回值是直接引用目標函數(shù)foo。

二、隱式綁定

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

舉個栗子:

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

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

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

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

注意:

隱式綁定的函數(shù)會丟失綁定對象。此時它會應用默認綁定,將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是直接引用了函數(shù)foo,是一個單純的函數(shù)調用,故實為默認綁定。

參數(shù)傳遞就是隱式賦值,因此傳入函數(shù)時也會被隱式賦值。
 eg:

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

運行結果: "biubiubiu"

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

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

三、顯式綁定

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

1、.call()
2、.apply()
這兩種綁定方法,第一個參數(shù)是this綁定的對象。(如果傳入的參數(shù)是原始值(字符串類型、布爾類型、數(shù)字類型),這個原始值就會被轉成對象形式(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()會返回一個新編碼函數(shù),把this綁定在指定參數(shù)上,并調用函數(shù)。

舉個栗子:

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

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

這里涉及到一個概念:把null或者undefined作為this的綁定對象傳入call、apply、bind,這些值在調用的時候會被忽略,實際應用默認綁定規(guī)則。
應用場景:
1、使用apply()展開一個數(shù)組,并作為參數(shù)傳遞給一個函數(shù)。
2、bind()對參數(shù)進行柯里化(預先設置一些參數(shù))。

舉個栗子:

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

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

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

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

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

四、new綁定

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

舉個栗子:

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

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

四種綁定規(guī)則的優(yōu)先級為:new>顯式>隱式>默認

箭頭函數(shù)

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

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

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

故:箭頭函數(shù)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風格(四種規(guī)則)詞法作用域風格(that = this和箭頭函數(shù))可供使用。使用時盡量避免混用,否則會造成難以維護的后果。

以上是Javascript的this如何使用的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

當前名稱:Javascript的this如何使用-創(chuàng)新互聯(lián)
分享路徑:http://aaarwkj.com/article48/jdiep.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網頁設計公司、響應式網站網站制作、網站改版、面包屑導航、網站導航

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網站建設
精品一区精品二区国产日韩| 精品国产品国语在线不卡| 91国产香蕉在线观看| 中文字幕人妻系列东京热| 国产成人精品手机在线观看| 国产一区在线免费在线观看| 精品欧美一区二区精品| 美女视频一区二区三区在线观看| 91亚洲蜜臀精品国产| 成人av免费高清在线播放| av影片天堂在线观看| 黄色亚洲日本欧美在线观看| 日韩av一区二区久久久| 97国产精品视频在线观看| 亚洲精品国产精品乱码不| 麻豆精品情欲人妻一区| 亚洲国产色一区二区三区| 久久婷婷综合激情亚洲| 亚洲欧美天堂一区二区| 日本高清不卡在线播放| 日韩人妻中出中文字幕| 国产成人av综合久久视色| 日韩精品欧美成人高清一区二区 | 欧美性大片一区二区三区| 青青草青青草在线观看视频| 国产色视频一区在线观看| 中文字幕成人资源网站| 日本女优高清不卡一二三四区| 久久精品国产av一一区| 女性裸体无遮挡啪啪网站| 欧美日韩亚洲国产专区精品| 日本中文字幕女优观看| 中文字幕人妻系列东京热| 亚洲午夜精品毛片成人| 国产精品乱码精品久久久| 日本女优中文字幕久久| 91好色视频在线观看| 国产精品伊人久久综合网| 国产激情久久久久久影院| av影片在线观看不卡| 国产自拍精品视频免费观看|