摘要:是的,始終指向調用對象,調用對象,這個很重要,的靜態成員是沒有的概念的。所以和,的區別是返回一個明確的新函數,和立即執行了。
1. 問題引入
function A() {} A.prototype.fna = function() { console.log(this); }
我的問題是 fna 的 this 是指向哪里的?
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
為什么會有以上這種情況呢,在 java 中 this 是始終指向調用對象的。是的,始終指向調用對象,調用對象,這個很重要,java 的靜態成員是沒有 this 的概念的。在 javascript 中 this 只和函數的執行環境有關。只有三種情況,在瀏覽中 window、調用對象、嚴格模式下的undefined,對應我們開發者來說能接觸到的就是以上三者,所以我們可以理解為 函數的執行環境就是以上三者。
2. 確定 this 指向我們如何確定 this 的指向呢,有很多文章介紹 this 確定指向,方式也有很多種,而我是根據函數的調用形勢去判斷的,有以下兩個判斷標準。
1 如果函數的最終調用形式是 fn(); 那么在非嚴格模式下 this 指向 window 對象,在嚴格模式下指向 undefined
2 如果是通過對象調用 o.fn(); 這種形式 this 指向對象 o
是的就這兩個標準,就這么簡單。
3. 通過 call 、apply、bind 深入理解 this函數調用原型
fn.call(thisArg, arg1, arg2, ...)
fn.apply(thisArg, [argsArray])
fn.bind(thisArg[, arg1[, arg2[, ...]]])
上面這三個函數都是用來改變函數的 this 指向的
1 call 第一個參數是 fn 中 this 的期望指向,值可以是 對象 或者 undefined,后面的參數是要傳遞 給 fn 的參數列表
2 apply 第一個參數是 fn 中 this 的期望指向,值可以是 對象 或者 undefined,后面的值是 fn 的 參數,是一個數組
call 和apply 功能相同,唯一不同的是選擇將參數以 參數列表 傳入或者以 數組 傳入,都可以,可以互換
使用。調用者兩個函數會立即執行 fn,這里是立即執行
3 bind 第一個參數是 fn 中 this 的期望指向,值可以是 對象 或者 undefined,后面的參數是要傳遞 給 fn 的參數列表
調用 bind 函數會返回一個函數,這個函數是 fn 的包裝,和 fn 的唯一區別是綁定了 this,即 this指向明確。所以 bind 和 call、apply,的區別是 bind 返回一個 this 明確的新函數,call 和 apply立即執行了 fn。
到這里我想 javascript 的 this 已經說的很清楚了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83941.html
摘要:現在我們從實現一個簡易的方法開始探索其中的機制。其中內部的可以將上一個的返回值傳遞給外部。一言以蔽之實現了遞歸調用的方法。當執行到的中間件沒有時并且返回的為時逆序執行。 本文發布在github.com/ssssyoki,歡迎star,issues共同交流。 Koa是基于Node.js的下一代web開發框架,相比Express更輕,源碼只有幾百行。與傳統的中間件不同,在Koa 1.x中采...
摘要:至于,其只是以數組的方傳入參數,其它部分是一樣的,如下它們也可用于在中的類繼承中,調用父級構造器。間接調用,調用了父級構造器對比方法和,它倆都立即執行了函數,而函數返回了一個新方法,綁定了預先指定好的,并可以延后調用。 其實this是一個老生常談的問題了。關于this的文章非常多,其實我本以為自己早弄明白了它,不過昨天在做項目的過程中,還是出現了一絲疑惑,想到大概之前在JavaScri...
摘要:看了高級程序設計中關于對象的介紹,記錄一下對于其中有些地方的疑惑。 看了《JavaScript高級程序設計》中關于對象的介紹,記錄一下對于其中有些地方的疑惑。 使用構造函數創建對象時,prototype中如果定義一個屬性指向函數,在函數中引用this,為什么this是指向構造函數而不是prototype對象? 試驗: function SuperType() { this.pr...
摘要:百煉成仙走紅該書于年月出版,作者楊逸飛是一名從事開發六年的程序員,寫過諸多技術博客。作者在博客上對粉絲提出關于百煉成仙的問題進行了統一回復,該博文持續占據熱榜第二,熱度達。 剛接觸編程的小伙伴,估計都想過把枯燥無聊的編程教材變成小說讀的念頭,這不,說曹操曹操就來了,真的有程序員用寫修仙小說的...
摘要:由于匿名函數的作用域是全局性的,因此閉包的通常指向全局對象調用返回值為而不是我們預期的,在閉包中函數作為某個對象的方法調用時,要特別注意,該方法內部匿名函數的指向的是全局變量。 有人的地方就有江湖,有函數的地方就有this。而this在不同的環境下,又表現為不同的形式,難免讓人有種此this非彼this的疑惑 在java等面向對象的語言中,this指的就是當前對象,而在jav...
閱讀 3245·2021-09-22 16:06
閱讀 3236·2021-09-02 15:40
閱讀 632·2019-08-30 15:54
閱讀 1035·2019-08-26 12:22
閱讀 1375·2019-08-26 12:17
閱讀 2742·2019-08-26 12:09
閱讀 502·2019-08-26 10:20
閱讀 783·2019-08-23 16:28