在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

ECMA Javascript中this的深入理解(附示例)

ECMA Javascript中this的深入理解(附示例)

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于ECMA Javascript中this的深入理解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

this 實際上是在函數被調用時發生的綁定,它指向什么完全取決于函數的調用位置(也就是函數的調用方法)。

四條規則:(你不知道的JS)

1. 默認綁定

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

無論是否在嚴格模式下,在全局執行上下文中(在任何函數體外部)this 都指代全局對象。(MDN)
在嚴格模式下,this將保持他進入執行上下文時的值,如果 this 沒有被執行上下文(execution context)定義,那它將保持為 undefined。(MDN)

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

2. 隱式綁定/丟失

當函數作為對象里的方法被調用時,它們的 this 是調用該函數的對象,且綁定只受最靠近的成員引用的影響。(MDN)

//隱式綁定
function foo() {
    console.log( this.a );
}
var obj2 = {
    a: 42,
    foo: foo
};
var obj1 = {
    a: 2,
    obj2: obj2
};
obj1.obj2.foo(); // 42
//隱式丟失
function foo() {
    console.log( this.a );
}
function doFoo(fn) {
    // fn 其實引用的是 foo
    fn(); // <-- 調用位置!
}
var obj = {
    a: 2,
    foo: foo
};
var a = "oops, global"; // a 是全局對象的屬性
doFoo( obj.foo ); // "oops, global"

3. 顯示綁定

如果要想把 this 的值從一個上下文傳到另一個,就要用 call 或者apply 方法。(MDN)
調用f.bind(someObject)會創建一個與f具有相同函數體和作用域的函數,但是在這個新函數中,this將永久地被綁定到了bind的第一個參數,無論這個函數是如何被調用的。

var obj = {
    count: 0,
    cool: function coolFn() {
    if (this.count < 1) {
        setTimeout( function timer(){
            this.count++; // this 是安全的
                            // 因為 bind(..)
            console.log( "more awesome" );
            }.bind( this ), 100 ); // look, bind()!
        }
    }
};
obj.cool(); // 更酷了。

硬綁定

創建一個包裹函數,傳入所有的參數并返回接收到的所有值。
硬綁定會大大降低函數的靈活性,使用硬綁定之后就無法使用隱式綁定或者顯式綁定來修改 this 。

// 簡單的輔助綁定函數
function bind(fn, obj) {
    return function() {
        return fn.apply( obj, arguments );
    };
}

軟綁定

給默認綁定指定一個全局對象和 undefined 以外的值,那就可以實現和硬綁定相同的效果,同時保留隱式綁定或者顯式綁定修改 this 的能力。

Function.prototype.softBind = function(obj) {
    var fn = this;
    var curried = [].slice.call( arguments, 1 );// 捕獲所有 curried 參數
    var bound = function() {
        return fn.apply(
            (!this || this === (window || global))?obj : this
            curried.concat.apply( curried, arguments )
        );
    };
    bound.prototype = Object.create( fn.prototype );
    return bound;
};

4. new 綁定

當一個函數用作構造函數時(使用new關鍵字),它的this被綁定到正在構造的新對象。(MDN)
使用 new 來調用函數,或者說發生構造函數調用時,會自動執行下面的操作(你不知道的JS)

  1. 創建(或者說構造)一個全新的對象。

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

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

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

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

四條規則優先級

new 綁定 > 顯式綁定 > 隱式綁定 > 默認綁定

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

     var bar = new foo()
  2. 函數是否通過 call 、 apply (顯式綁定)或者硬綁定調用?如果是的話, this 綁定的是指定的對象。
    另外:如果綁定 null 或者 undefined ,實際應用的是默認綁定規則。

     var bar = foo.call(obj2)
  3. 函數是否在某個上下文對象中調用(隱式綁定)?如果是的話, this 綁定的是那個上下文對象。

     var bar = obj1.foo()
  4. 如果都不是的話,使用默認綁定。如果在嚴格模式下,就綁定到 undefined ,否則綁定到全局對象。

     var bar = foo()

    其中:間接引用函數會應用默認綁定規則

    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

例外

1. 箭頭函數

箭頭函數不使用 this 的四種標準規則,而是根據外層(函數或者全局)作用域來決定 this 。
在箭頭函數中,this與封閉詞法上下文的this保持一致。(MDN)
箭頭函數會繼承外層函數調用的 this 綁定(無論 this 綁定到什么)。這其實和self = this 機制一樣。
箭頭函數的綁定無法被修改。

2. nodejs

setTimeout(function() { 
    console.log(this) 
    //瀏覽器中:window 
    //nodejs中:Timeout實例
}, 0)

其他解釋

https://www.zhihu.com/questio...
func(p1, p2) 等價于
func.call(undefined, p1, p2)

obj.child.method(p1, p2) 等價于
obj.child.method.call(obj.child, p1, p2)

如果你傳的 context 就 null 或者 undefined,那么 window 對象就是默認的 context(嚴格模式下默認 context 是 undefined)

例子

    var number = 50;
    var obj = {
        number: 60,
        getNum: function () {
        var number = 70;
        return this.number;
    }
    }; 

    alert(obj.getNum());
    alert(obj.getNum.call());
    alert(obj.getNum.call({number:20}));

以上就是ECMA Javascript中this的深入理解(附示例)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 免费超爽大片黄| 成人3d动漫一区二区三区| www.超碰97.com| 欧美视频第三页| 女人喷潮完整视频| 午夜精品久久久久久久无码| 毛片av在线播放| 超级碰在线观看| 国产真人做爰毛片视频直播| www.18av.com| 无码 制服 丝袜 国产 另类| 国产在线视频综合| 黄页网站大全在线观看| 国产成人无码a区在线观看视频| 蜜桃视频一区二区在线观看| 免费观看国产视频在线| 国产一二三区在线播放| 亚洲激情免费视频| 国产免费黄色小视频| 欧美激情视频免费看| 男人靠女人免费视频网站| 日本熟妇人妻xxxxx| 欧美伦理片在线观看| 91xxx视频| av片在线免费| 91蝌蚪视频在线观看| 91极品视频在线观看| 日韩人妻精品一区二区三区| 国产日韩欧美精品在线观看| 大肉大捧一进一出好爽视频| 99re精彩视频| 亚洲国产精品无码观看久久| 成人在线观看黄| 午夜啪啪福利视频| www国产黄色| 香蕉视频xxxx| 成人久久久久久久久| 久久久久久综合网| 国产精品视频一区二区三区四区五区| 久热精品在线观看视频| 台湾无码一区二区| 亚洲18在线看污www麻豆| 日本天堂免费a| 亚洲小视频网站| 97成人在线观看视频| 亚洲av首页在线| 一区二区三区网址| 国产精品50p| 国产小视频免费| 国产毛片久久久久久| 18岁视频在线观看| 成人国产一区二区三区| 国产免费中文字幕| 精品久久久久久中文字幕2017| av一区二区三区免费观看| 亚洲美女爱爱视频| 午夜免费精品视频| 久热免费在线观看| 国产精品又粗又长| 日韩五码在线观看| 国产亚洲黄色片| 成人短视频在线观看免费| 女人高潮一级片| gogogo高清免费观看在线视频| 十八禁视频网站在线观看| 黄色一级片播放| 大伊香蕉精品视频在线| 国产成人一二三区| 精品国偷自产一区二区三区| 日韩国产精品毛片| 成人国产一区二区三区| 亚洲天堂第一区| 亚洲 欧美 综合 另类 中字| 成人一区二区av| 僵尸世界大战2 在线播放| 日韩小视频网站| 国产h视频在线播放| 免费在线激情视频| 亚洲一级片网站| 在线观看视频黄色| 欧洲xxxxx| 天堂8在线天堂资源bt| 国产毛片视频网站| 亚洲乱码国产一区三区| 日本中文字幕二区| 免费看污污视频| 三上悠亚久久精品| 成人在线看视频| 成人性生交视频免费观看| 亚洲一区二区三区四区精品| 天天做天天躁天天躁| 国产精品专区在线| 一路向西2在线观看| 男人天堂成人网| 国产熟女高潮视频| 日本xxxxx18| 国产又大又硬又粗| 免费观看黄色大片| 欧美性大战久久久久xxx| 91国内在线播放| 你懂的av在线| 国产三级生活片| 男女视频网站在线观看| 久久国产激情视频| 六月婷婷在线视频| www,av在线| 成人三级视频在线播放| 日韩一级特黄毛片| 日本中文字幕观看| 男人揉女人奶房视频60分| 一二三级黄色片| 日韩视频第二页| 岛国大片在线播放| 国产高清免费在线| 欧美婷婷精品激情| 日韩在线视频在线| 最新视频 - x88av| 久久99999| 亚洲熟妇av一区二区三区| 国产 国语对白 露脸| 欧美一级免费在线| 午夜视频你懂的| 成人观看免费完整观看| 欧美日韩午夜爽爽| 潘金莲一级淫片aaaaaa播放1| 精品久久久久av| 日本www在线播放| 性高湖久久久久久久久aaaaa| 毛毛毛毛毛毛毛片123| 天天综合天天添夜夜添狠狠添| 欧美色图另类小说| 欧美 激情 在线| 免费看国产曰批40分钟| 亚洲精品无码国产| 青娱乐自拍偷拍| 播放灌醉水嫩大学生国内精品| 人人妻人人澡人人爽欧美一区双| 日韩视频在线免费播放| 亚洲欧美日本一区二区三区| 色综合色综合色综合色综合| 黄色av免费在线播放| 女人另类性混交zo| av免费网站观看| 黄色手机在线视频| 一级淫片在线观看| 三上悠亚免费在线观看| 亚洲视频在线不卡| 国产毛片久久久久久国产毛片| 日韩成人手机在线| 女性隐私黄www网站视频| 成年人黄色片视频| 欧美视频国产视频| 五月天综合婷婷| 被灌满精子的波多野结衣| 亚洲成熟丰满熟妇高潮xxxxx| 激情五月开心婷婷| 国产又黄又猛的视频| 久久综合在线观看| 亚洲美免无码中文字幕在线| 人妻少妇被粗大爽9797pw| 视频二区在线播放| 欧美精品久久96人妻无码| 成人一对一视频| 黄大色黄女片18第一次| 中文字幕日韩精品无码内射| 波多野结衣家庭教师视频| theporn国产精品| 亚洲国产精品成人天堂| 中文字幕永久有效| 欧美深夜福利视频| 国内精品国产三级国产aⅴ久| av在线播放亚洲| 色18美女社区| 无码人妻精品一区二区三区66| 特色特色大片在线| 狠狠操狠狠干视频| 国产91在线视频观看| 中文字幕超清在线免费观看| 国产九色porny| av电影一区二区三区| 国产精品igao| 免费黄色日本网站| 日韩在线观看a| 欧美日韩一区二区三区电影| 9久久婷婷国产综合精品性色| 国产一线二线三线女| 欧美亚洲视频一区| 五月婷婷激情久久| 毛片在线视频播放| 日本阿v视频在线观看| 国产精品99久久久久久大便| a在线观看免费视频| 粉嫩虎白女毛片人体| r级无码视频在线观看| 日本一道在线观看| 天天成人综合网| 国产四区在线观看| 欧美视频国产视频| 思思久久精品视频| 狠狠干狠狠操视频|