国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript this 從此不再疑惑

Barrior / 3460人閱讀

摘要:是的,始終指向調用對象,調用對象,這個很重要,的靜態成員是沒有的概念的。所以和,的區別是返回一個明確的新函數,和立即執行了。

1. 問題引入
function A() {}
A.prototype.fna = function() {
    console.log(this);
}

我的問題是 fnathis 是指向哪里的?

var a = new A();
a.fna();  // A {}

var fnt = a.fna;
fnt();  // window {...}

再看我們經常遇到的情形

function A() {
    this.name = "A";
}

A.prototype.fna = function() {
    return this.name;
}

function sayName(fn) {
    console.log(fn());
}

var a = new A();
sayName(a.fna); //undefined
sayName(a.fna.bind(a));  //A

這里就是我們平時在寫代碼的時候為什么要調用 bind 函數來綁定上下文

function A() {
    this.fna = function() {
        console.log(this);
    }
}

A.prototype.getFna = function() {
    return this.fna;
}

function sayContext(fn) {
    fn();
}

var a = new A();
var fna = a.getFna();
sayContext(fna);  //window

為什么會有以上這種情況呢,在 javathis 是始終指向調用對象的。是的,始終指向調用對象,調用對象,這個很重要,java 的靜態成員是沒有 this 的概念的。在 javascriptthis 只和函數的執行環境有關。只有三種情況,在瀏覽中 window、調用對象、嚴格模式下的undefined,對應我們開發者來說能接觸到的就是以上三者,所以我們可以理解為 函數的執行環境就是以上三者。

2. 確定 this 指向

我們如何確定 this 的指向呢,有很多文章介紹 this 確定指向,方式也有很多種,而我是根據函數的調用形勢去判斷的,有以下兩個判斷標準。

1 如果函數的最終調用形式是 fn(); 那么在非嚴格模式下 this 指向 window 對象,在嚴格模式下指向 undefined
2 如果是通過對象調用 o.fn(); 這種形式 this 指向對象 o

是的就這兩個標準,就這么簡單。

3. 通過 callapplybind 深入理解 this

函數調用原型

fn.call(thisArg, arg1, arg2, ...)
fn.apply(thisArg, [argsArray])
fn.bind(thisArg[, arg1[, arg2[, ...]]])

上面這三個函數都是用來改變函數的 this 指向的
1 call 第一個參數是 fnthis 的期望指向,值可以是 對象 或者 undefined,后面的參數是要傳遞 給 fn 的參數列表

2 apply 第一個參數是 fnthis 的期望指向,值可以是 對象 或者 undefined,后面的值是 fn 的 參數,是一個數組

callapply 功能相同,唯一不同的是選擇將參數以 參數列表 傳入或者以 數組 傳入,都可以,可以互換
使用。調用者兩個函數會立即執行 fn,這里是立即執行

3 bind 第一個參數是 fnthis 的期望指向,值可以是 對象 或者 undefined,后面的參數是要傳遞 給 fn 的參數列表

調用 bind 函數會返回一個函數,這個函數是 fn 的包裝,和 fn 的唯一區別是綁定了 this,即 this指向明確。所以 bindcallapply,的區別是 bind 返回一個 this 明確的新函數,callapply立即執行了 fn

到這里我想 javascriptthis 已經說的很清楚了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83941.html

相關文章

  • 對Koa-middleware實現機制的分析

    摘要:現在我們從實現一個簡易的方法開始探索其中的機制。其中內部的可以將上一個的返回值傳遞給外部。一言以蔽之實現了遞歸調用的方法。當執行到的中間件沒有時并且返回的為時逆序執行。 本文發布在github.com/ssssyoki,歡迎star,issues共同交流。 Koa是基于Node.js的下一代web開發框架,相比Express更輕,源碼只有幾百行。與傳統的中間件不同,在Koa 1.x中采...

    MageekChiu 評論0 收藏0
  • 不再彷徨:完全弄懂JavaScript中的this(譯文總結)

    摘要:至于,其只是以數組的方傳入參數,其它部分是一樣的,如下它們也可用于在中的類繼承中,調用父級構造器。間接調用,調用了父級構造器對比方法和,它倆都立即執行了函數,而函數返回了一個新方法,綁定了預先指定好的,并可以延后調用。 其實this是一個老生常談的問題了。關于this的文章非常多,其實我本以為自己早弄明白了它,不過昨天在做項目的過程中,還是出現了一絲疑惑,想到大概之前在JavaScri...

    YanceyOfficial 評論0 收藏0
  • JavaScript prototype 疑惑

    摘要:看了高級程序設計中關于對象的介紹,記錄一下對于其中有些地方的疑惑。 看了《JavaScript高級程序設計》中關于對象的介紹,記錄一下對于其中有些地方的疑惑。 使用構造函數創建對象時,prototype中如果定義一個屬性指向函數,在函數中引用this,為什么this是指向構造函數而不是prototype對象? 試驗: function SuperType() { this.pr...

    Half 評論0 收藏0
  • 編程界也有修仙秘籍?程序員碼字3年終得《JavaScript 百煉成仙》

    摘要:百煉成仙走紅該書于年月出版,作者楊逸飛是一名從事開發六年的程序員,寫過諸多技術博客。作者在博客上對粉絲提出關于百煉成仙的問題進行了統一回復,該博文持續占據熱榜第二,熱度達。 剛接觸編程的小伙伴,估計都想過把枯燥無聊的編程教材變成小說讀的念頭,這不,說曹操曹操就來了,真的有程序員用寫修仙小說的...

    zzbo 評論0 收藏0
  • 深入javascript——無處不在的this

    摘要:由于匿名函數的作用域是全局性的,因此閉包的通常指向全局對象調用返回值為而不是我們預期的,在閉包中函數作為某個對象的方法調用時,要特別注意,該方法內部匿名函數的指向的是全局變量。 有人的地方就有江湖,有函數的地方就有this。而this在不同的環境下,又表現為不同的形式,難免讓人有種此this非彼this的疑惑 在java等面向對象的語言中,this指的就是當前對象,而在jav...

    Scorpion 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<