摘要:關于的全棉解析上的文章地址判斷函數是否在中調用綁定如果是的話綁定的是新創建的對象。顯而易見,這種方式可能會導致許多難以分析和追蹤的。默認在嚴格模式下綁定到,否則綁定到全局對象。
關于this的全棉解析(上)的文章地址
判斷this函數是否在new中調用(new綁定)?如果是的話this綁定的是新創建的對象。
bar = new foo()
函數是否通過call、apply(顯式綁定)或者硬綁定調用?如果是的話,this綁定的是指定的對象。
bar = foo.call(obj2)
函數是否在某個上下文對象中調用(隱式綁定)?如果是的話,this綁定的是那個上下文對象。
bar = obj1.foo()
如果都不是的話,使用默認綁定。如果在嚴格模式下,就綁定到undefined,否則綁定到全局對象。
bar = foo();
綁定例外如果把null或者undefined作為this的綁定對象傳入call、apply或者bind,這些值在調用時會被忽略,實際應用的是默認綁定規則。
function foo() { console.log(this.a); } var a = 2; foo.call(null); //2
然而,總是使用null來忽略this綁定可能產生一些副作用。如果某個函數確實使用了this,那默認綁定規則會把this綁定到全局對象(在瀏覽器中全局對象為window),這將導致不可預計的后果(比如修改全局對象)。
顯而易見,這種方式可能會導致許多難以分析和追蹤的bug。
一種“更安全”的做法是傳入一個特殊的對象、把this綁定到這個對象不會對你的程序產生副作用。
在JavaScript中創建一個空對象最簡單的方法都是Object.create(null),但是并不會創建Object.prototype這個委托。
function foo(a, b) { console.log("a:" + a + ", b:" + b); } //創建一個新對象 var emptyObj = Object.create(null); foo.apply(emptyObj, [2, 3]) var bar = foo.bind(emptyObj, 2); bar(3);
間接引用最容易在賦值時發生。
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()而不是p.foo()或者o.foo(),所以綁定的是全局對象。
小結如果要判斷一個運行中函數的this綁定,就需要找到這個函數的直接調用位置。找到之后就可以順序應用下面這四條規則來判斷this的綁定對象。
由new調用?綁定到新創建的對象。
由call或者apply(或者bind)調用?綁定到指定的對象。
由上下文對象調用?綁定到那個上下文對象。
默認:在嚴格模式下綁定到undefined,否則綁定到全局對象。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79700.html
摘要:關于的全面解析下頁面鏈接的調用位置調用位置就是函數在代碼中被調用的位置而不是聲明的位置,尋找調用位置就是尋找函數被調用的位置,最重要的是分析調用棧就是為了到達當前執行位置所調用的所有函數。因此,調用函數時被綁定到這個對象上,所以和是一樣的。 關于this的全面解析(下)頁面鏈接 this的調用位置 調用位置就是函數在代碼中被調用的位置(而不是聲明的位置),尋找調用位置就是尋找函數被調用...
摘要:調用棧就是為了到達當前執行位置所調用的所有函數。由于無法控制回調函數的執行方式,因此就沒有辦法控制調用位置得到期望的綁定,下一節我們會介紹如何通過固定來修復這個問題。 在《你不知道的this》中我們排除了對于this的錯誤理解,并且明白了每個函數的this是在調用時綁定的,完全取決于函數的調用位置。在本節中我們主要介紹一下幾個主要內容: 什么是調用位置 綁定規則 this詞法 調用...
摘要:在傳統的面向類的語言中,構造函數是類中的一些特殊方法,使用初始化類是會調用類中的構造函數。 在上一節中我們詳細介紹了this的兩種綁定方式,默認綁定和隱式綁定,在這一節我們繼續介紹this的另外兩種綁定方式顯示綁定和new綁定。那么,我們要解決的問題當然就是上一節中我們提到的:this丟失! 顯式綁定 在隱式綁定中,我們必須在一個對象的內部包含一個指向函數的屬性,并通過這個屬性間接引用...
摘要:所以也就是說在沒有的基礎上,執行代碼會在串池中創建一個,也會在堆內存中再出來一個。不可變性的優點安全性字符串不可變安全性的考慮處于兩個方面,數據安全和線程安全。 摘要: String基本特性,String源碼,為什么String不可變? 前言 基于字符串String在java中的地位,關于String的常識性知識就不多做介紹了,我們先來看一段代碼 public class Test {...
摘要:用小程序云開發將博客小程序常用功能一網打盡本文介紹博客小程序的詳情頁的功能按鈕如何實現,具體包括評論點贊收藏和海報功能,這里記錄下整個實現過程和實際編碼中的一些坑。考慮到小程序本身的大小限制,使用的方式是最佳的。 用小程序·云開發將博客小程序常用功能一網打盡 本文介紹mini博客小程序的詳情頁的功能按鈕如何實現,具體包括評論、點贊、收藏和海報功能,這里記錄下整個實現過程和實際編碼中的一...
閱讀 3095·2021-10-13 09:40
閱讀 3945·2021-09-22 15:51
閱讀 1493·2021-09-22 15:48
閱讀 1060·2021-09-06 15:00
閱讀 1790·2019-08-30 15:43
閱讀 2356·2019-08-29 18:35
閱讀 1667·2019-08-29 16:18
閱讀 3612·2019-08-29 12:49