摘要:在嚴格模式下調(diào)用函數(shù)則不影響默認綁定?;卣{(diào)函數(shù)丟失綁定是非常常見的。因為直接指定的綁定對象,稱之為顯示綁定。調(diào)用時強制把的綁定到上顯示綁定無法解決丟失綁定問題。
(關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo))
本周正式開始前端進階的第三期,本周的主題是this全面解析,今天是第9天。
本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了解本進階計劃,點擊查看前端進階的破冰之旅
如果覺得本系列不錯,歡迎轉(zhuǎn)發(fā),您的支持就是我堅持的最大動力。
本期推薦文章你不知道的JavaScript上卷—筆記,由于微信不能訪問外鏈,點擊閱讀原文就可以啦。
推薦理由這篇文章是我的讀書筆記,非常詳細的記錄了this綁定的5種規(guī)則,有代碼,有解釋,看完絕對攻克this盲區(qū),加油。
閱讀筆記this的綁定規(guī)則總共有下面5種。
1、默認綁定(嚴格/非嚴格模式)
2、隱式綁定
3、顯式綁定
4、new綁定
5、箭頭函數(shù)綁定
現(xiàn)在開始一個一個介紹,內(nèi)容來自《你不知道的JS》筆記整理。
1 調(diào)用位置調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置(而不是聲明的位置)。
查找方法:
分析調(diào)用棧:調(diào)用位置就是當(dāng)前正在執(zhí)行的函數(shù)的前一個調(diào)用中
function baz() { // 當(dāng)前調(diào)用棧是:baz // 因此,當(dāng)前調(diào)用位置是全局作用域 console.log( "baz" ); bar(); // <-- bar的調(diào)用位置 } function bar() { // 當(dāng)前調(diào)用棧是:baz --> bar // 因此,當(dāng)前調(diào)用位置在baz中 console.log( "bar" ); foo(); // <-- foo的調(diào)用位置 } function foo() { // 當(dāng)前調(diào)用棧是:baz --> bar --> foo // 因此,當(dāng)前調(diào)用位置在bar中 console.log( "foo" ); } baz(); // <-- baz的調(diào)用位置
使用開發(fā)者工具得到調(diào)用棧:
設(shè)置斷點或者插入debugger;語句,運行時調(diào)試器會在那個位置暫停,同時展示當(dāng)前位置的函數(shù)調(diào)用列表,這就是調(diào)用棧。找到棧中的第二個元素,這就是真正的調(diào)用位置。
2 綁定規(guī)則獨立函數(shù)調(diào)用,可以把默認綁定看作是無法應(yīng)用其他規(guī)則時的默認規(guī)則,this指向全局對象。
嚴格模式下,不能將全局對象用于默認綁定,this會綁定到undefined。只有函數(shù)運行在非嚴格模式下,默認綁定才能綁定到全局對象。在嚴格模式下調(diào)用函數(shù)則不影響默認綁定。
function foo() { // 運行在嚴格模式下,this會綁定到undefined "use strict"; console.log( this.a ); } var a = 2; // 調(diào)用 foo(); // TypeError: Cannot read property "a" of undefined // -------------------------------------- function foo() { // 運行 console.log( this.a ); } var a = 2; (function() { // 嚴格模式下調(diào)用函數(shù)則不影響默認綁定 "use strict"; foo(); // 2 })();
當(dāng)函數(shù)引用有上下文對象時,隱式綁定規(guī)則會把函數(shù)中的this綁定到這個上下文對象。對象屬性引用鏈中只有上一層或者說最后一層在調(diào)用中起作用。
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2
隱式丟失
被隱式綁定的函數(shù)特定情況下會丟失綁定對象,應(yīng)用默認綁定,把this綁定到全局對象或者undefined上。
// 雖然bar是obj.foo的一個引用,但是實際上,它引用的是foo函數(shù)本身。 // bar()是一個不帶任何修飾的函數(shù)調(diào)用,應(yīng)用默認綁定。 function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; var bar = obj.foo; // 函數(shù)別名 var a = "oops, global"; // a是全局對象的屬性 bar(); // "oops, global"
參數(shù)傳遞就是一種隱式賦值,傳入函數(shù)時也會被隱式賦值。回調(diào)函數(shù)丟失this綁定是非常常見的。
function foo() { console.log( this.a ); } function doFoo(fn) { // fn其實引用的是foo fn(); // <-- 調(diào)用位置! } var obj = { a: 2, foo: foo }; var a = "oops, global"; // a是全局對象的屬性 doFoo( obj.foo ); // "oops, global" // ---------------------------------------- // JS環(huán)境中內(nèi)置的setTimeout()函數(shù)實現(xiàn)和下面的偽代碼類似: function setTimeout(fn, delay) { // 等待delay毫秒 fn(); // <-- 調(diào)用位置! }
通過call(..) 或者 apply(..)方法。第一個參數(shù)是一個對象,在調(diào)用函數(shù)時將這個對象綁定到this。因為直接指定this的綁定對象,稱之為顯示綁定。
function foo() { console.log( this.a ); } var obj = { a: 2 }; foo.call( obj ); // 2 調(diào)用foo時強制把foo的this綁定到obj上
顯示綁定無法解決丟失綁定問題。
解決方案:
1、硬綁定
創(chuàng)建函數(shù)bar(),并在它的內(nèi)部手動調(diào)用foo.call(obj),強制把foo的this綁定到了obj。這種方式讓我想起了借用構(gòu)造函數(shù)繼承,沒看過的可以點擊查看 JavaScript常用八種繼承方案
function foo() { console.log( this.a ); } var obj = { a: 2 }; var bar = function() { foo.call( obj ); }; bar(); // 2 setTimeout( bar, 100 ); // 2 // 硬綁定的bar不可能再修改它的this bar.call( window ); // 2
典型應(yīng)用場景是創(chuàng)建一個包裹函數(shù),負責(zé)接收參數(shù)并返回值。
function foo(something) { console.log( this.a, something ); return this.a + something; } var obj = { a: 2 }; var bar = function() { return foo.apply( obj, arguments ); }; var b = bar( 3 ); // 2 3 console.log( b ); // 5
創(chuàng)建一個可以重復(fù)使用的輔助函數(shù)。
function foo(something) { console.log( this.a, something ); return this.a + something; } // 簡單的輔助綁定函數(shù) function bind(fn, obj) { return function() { return fn.apply( obj, arguments ); } } var obj = { a: 2 }; var bar = bind( foo, obj ); var b = bar( 3 ); // 2 3 console.log( b ); // 5
ES5內(nèi)置了Function.prototype.bind,bind會返回一個硬綁定的新函數(shù),用法如下。
function foo(something) { console.log( this.a, something ); return this.a + something; } var obj = { a: 2 }; var bar = foo.bind( obj ); var b = bar( 3 ); // 2 3 console.log( b ); // 5
2、API調(diào)用的“上下文”
JS許多內(nèi)置函數(shù)提供了一個可選參數(shù),被稱之為“上下文”(context),其作用和bind(..)一樣,確?;卣{(diào)函數(shù)使用指定的this。這些函數(shù)實際上通過call(..)和apply(..)實現(xiàn)了顯式綁定。
function foo(el) { console.log( el, this.id ); } var obj = { id: "awesome" } var myArray = [1, 2, 3] // 調(diào)用foo(..)時把this綁定到obj myArray.forEach( foo, obj ); // 1 awesome 2 awesome 3 awesome
在JS中,構(gòu)造函數(shù)只是使用new操作符時被調(diào)用的普通函數(shù),他們不屬于某個類,也不會實例化一個類。
包括內(nèi)置對象函數(shù)(比如Number(..))在內(nèi)的所有函數(shù)都可以用new來調(diào)用,這種函數(shù)調(diào)用被稱為構(gòu)造函數(shù)調(diào)用。
實際上并不存在所謂的“構(gòu)造函數(shù)”,只有對于函數(shù)的“構(gòu)造調(diào)用”。
使用new來調(diào)用函數(shù),或者說發(fā)生構(gòu)造函數(shù)調(diào)用時,會自動執(zhí)行下面的操作。
1、創(chuàng)建(或者說構(gòu)造)一個新對象。
2、這個新對象會被執(zhí)行[[Prototype]]連接。
3、這個新對象會綁定到函數(shù)調(diào)用的this。
4、如果函數(shù)沒有返回其他對象,那么new表達式中的函數(shù)調(diào)用會自動返回這個新對象。
使用new來調(diào)用foo(..)時,會構(gòu)造一個新對象并把它(bar)綁定到foo(..)調(diào)用中的this。
function foo(a) { this.a = a; } var bar = new foo(2); // bar和foo(..)調(diào)用中的this進行綁定 console.log( bar.a ); // 2
手寫一個new實現(xiàn)
function create() { // 創(chuàng)建一個空的對象 let obj = new Object() // 獲得構(gòu)造函數(shù) let Con = [].shift.call(arguments) // 鏈接到原型 obj.__proto__ = Con.prototype // 綁定 this,執(zhí)行構(gòu)造函數(shù) let result = Con.apply(obj, arguments) // 確保 new 出來的是個對象 return typeof result === "object" ? result : obj }
使用這個手寫的new
function Person() {...} // 使用內(nèi)置函數(shù)new var person = new Person(...) // 使用手寫的new,即create var person = create(Person, ...)
代碼原理解析:
1、用new Object() 的方式新建了一個對象obj
2、取出第一個參數(shù),就是我們要傳入的構(gòu)造函數(shù)。此外因為 shift 會修改原數(shù)組,所以 arguments 會被去除第一個參數(shù)
3、將 obj 的原型指向構(gòu)造函數(shù),這樣 obj 就可以訪問到構(gòu)造函數(shù)原型中的屬性
4、使用 apply,改變構(gòu)造函數(shù) this 的指向到新建的對象,這樣 obj 就可以訪問到構(gòu)造函數(shù)中的屬性
5、返回 obj
3 優(yōu)先級st=>start: Start e=>end: End cond1=>condition: new綁定 op1=>operation: this綁定新創(chuàng)建的對象, var bar = new foo() cond2=>condition: 顯示綁定 op2=>operation: this綁定指定的對象, var bar = foo.call(obj2) cond3=>condition: 隱式綁定 op3=>operation: this綁定上下文對象, var bar = obj1.foo() op4=>operation: 默認綁定 op5=>operation: 函數(shù)體嚴格模式下綁定到undefined, 否則綁定到全局對象, var bar = foo() st->cond1 cond1(yes)->op1->e cond1(no)->cond2 cond2(yes)->op2->e cond2(no)->cond3 cond3(yes)->op3->e cond3(no)->op4->op5->e
在new中使用硬綁定函數(shù)的目的是預(yù)先設(shè)置函數(shù)的一些參數(shù),這樣在使用new進行初始化時就可以只傳入其余的參數(shù)(柯里化)。
function foo(p1, p2) { this.val = p1 + p2; } // 之所以使用null是因為在本例中我們并不關(guān)心硬綁定的this是什么 // 反正使用new時this會被修改 var bar = foo.bind( null, "p1" ); var baz = new bar( "p2" ); baz.val; // p1p24 綁定例外
把null或者undefined作為this的綁定對象傳入call、apply或者bind,這些值在調(diào)用時會被忽略,實際應(yīng)用的是默認規(guī)則。
下面兩種情況下會傳入null
使用apply(..)來“展開”一個數(shù)組,并當(dāng)作參數(shù)傳入一個函數(shù)
bind(..)可以對參數(shù)進行柯里化(預(yù)先設(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
總是傳入null來忽略this綁定可能產(chǎn)生一些副作用。如果某個函數(shù)確實使用了this,那默認綁定規(guī)則會把this綁定到全局對象中。
更安全的this
安全的做法就是傳入一個特殊的對象(空對象),把this綁定到這個對象不會對你的程序產(chǎn)生任何副作用。
JS中創(chuàng)建一個空對象最簡單的方法是Object.create(null),這個和{}很像,但是并不會創(chuàng)建Object.prototype這個委托,所以比{}更空。
function foo(a, b) { console.log( "a:" + a + ",b:" + b ); } // 我們的空對象 var ? = Object.create( null ); // 把數(shù)組”展開“成參數(shù) foo.apply( ?, [2, 3] ); // a:2,b:3 // 使用bind(..)進行柯里化 var bar = foo.bind( ?, 2 ); bar( 3 ); // a:2,b:3
間接引用下,調(diào)用這個函數(shù)會應(yīng)用默認綁定規(guī)則。間接引用最容易在賦值時發(fā)生。
// p.foo = o.foo的返回值是目標函數(shù)的引用,所以調(diào)用位置是foo()而不是p.foo()或者o.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
硬綁定可以把this強制綁定到指定的對象(new除外),防止函數(shù)調(diào)用應(yīng)用默認綁定規(guī)則。但是會降低函數(shù)的靈活性,使用硬綁定之后就無法使用隱式綁定或者顯式綁定來修改this。
如果給默認綁定指定一個全局對象和undefined以外的值,那就可以實現(xiàn)和硬綁定相同的效果,同時保留隱式綁定或者顯示綁定修改this的能力。
// 默認綁定規(guī)則,優(yōu)先級排最后 // 如果this綁定到全局對象或者undefined,那就把指定的默認對象obj綁定到this,否則不會修改this if(!Function.prototype.softBind) { Function.prototype.softBind = function(obj) { var fn = this; // 捕獲所有curried參數(shù) var curried = [].slice.call( arguments, 1 ); 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; }; }
使用:軟綁定版本的foo()可以手動將this綁定到obj2或者obj3上,但如果應(yīng)用默認綁定,則會將this綁定到obj。
function foo() { console.log("name:" + this.name); } var obj = { name: "obj" }, obj2 = { name: "obj2" }, obj3 = { name: "obj3" }; // 默認綁定,應(yīng)用軟綁定,軟綁定把this綁定到默認對象obj var fooOBJ = foo.softBind( obj ); fooOBJ(); // name: obj // 隱式綁定規(guī)則 obj2.foo = foo.softBind( obj ); obj2.foo(); // name: obj2 <---- 看?。?! // 顯式綁定規(guī)則 fooOBJ.call( obj3 ); // name: obj3 <---- 看!??! // 綁定丟失,應(yīng)用軟綁定 setTimeout( obj2.foo, 10 ); // name: obj5 this詞法
ES6新增一種特殊函數(shù)類型:箭頭函數(shù),箭頭函數(shù)無法使用上述四條規(guī)則,而是根據(jù)外層(函數(shù)或者全局)作用域(詞法作用域)來決定this。
foo()內(nèi)部創(chuàng)建的箭頭函數(shù)會捕獲調(diào)用時foo()的this。由于foo()的this綁定到obj1,bar(引用箭頭函數(shù))的this也會綁定到obj1,箭頭函數(shù)的綁定無法被修改(new也不行)。
function foo() { // 返回一個箭頭函數(shù) return (a) => { // this繼承自foo() console.log( this.a ); }; } var obj1 = { a: 2 }; var obj2 = { a: 3 } var bar = foo.call( obj1 ); bar.call( obj2 ); // 2,不是3!
ES6之前和箭頭函數(shù)類似的模式,采用的是詞法作用域取代了傳統(tǒng)的this機制。
function foo() { var self = this; // lexical capture of this setTimeout( function() { console.log( self.a ); // self只是繼承了foo()函數(shù)的this綁定 }, 100 ); } var obj = { a: 2 }; foo.call(obj); // 2
代碼風(fēng)格統(tǒng)一問題:如果既有this風(fēng)格的代碼,還會使用 seft = this 或者箭頭函數(shù)來否定this機制。
只使用詞法作用域并完全拋棄錯誤this風(fēng)格的代碼;
完全采用this風(fēng)格,在必要時使用bind(..),盡量避免使用 self = this 和箭頭函數(shù)。
上期思考題解代碼1:
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope();
代碼2:
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } var foo = checkscope(); foo();
上面的兩個代碼中,checkscope()執(zhí)行完成后,閉包f所引用的自由變量scope會被垃圾回收嗎?為什么?
解答:
checkscope()執(zhí)行完成后,代碼1中自由變量特定時間之后回收,代碼2中自由變量不回收。
首先要說明的是,現(xiàn)在主流瀏覽器的垃圾回收算法是標記清除,標記清除并非是標記執(zhí)行棧的進出,而是從根開始遍歷,也是一個找引用關(guān)系的過程,但是因為從根開始,相互引用的情況不會被計入。所以當(dāng)垃圾回收開始時,從Root(全局對象)開始尋找這個對象的引用是否可達,如果引用鏈斷裂,那么這個對象就會回收。
閉包中的作用域鏈中 parentContext.vo 是對象,被放在堆中,棧中的變量會隨著執(zhí)行環(huán)境進出而銷毀,堆中需要垃圾回收,閉包內(nèi)的自由變量會被分配到堆上,所以當(dāng)外部方法執(zhí)行完畢后,對其的引用并沒有丟。
每次進入函數(shù)執(zhí)行時,會重新創(chuàng)建可執(zhí)行環(huán)境和活動對象,但函數(shù)的[[Scope]]是函數(shù)定義時就已經(jīng)定義好的(詞法作用域規(guī)則),不可更改。
對于代碼1:
checkscope()執(zhí)行時,將checkscope對象指針壓入棧中,其執(zhí)行環(huán)境變量如下
checkscopeContext:{ AO:{ arguments: scope: f: }, this, [[Scope]]:[AO, globalContext.VO] }
執(zhí)行完畢后出棧,該對象沒有綁定給誰,從Root開始查找無法可達,此活動對象一段時間后會被回收
對于代碼2:
checkscope()執(zhí)行后,返回的是f對象,其執(zhí)行環(huán)境變量如下
fContext:{ AO:{ arguments: }, this, [[Scope]]:[AO, checkscopeContext.AO, globalContext.VO] }
此對象賦值給var foo = checkscope();,將foo 壓入棧中,foo 指向堆中的f活動對象,對于Root來說可達,不會被回收。
如果一定要自由變量scope回收,那么該怎么辦???
很簡單,foo = null;,把引用斷開就可以了。
本期思考題依次給出console.log輸出的數(shù)值。
var num = 1; var myObject = { num: 2, add: function() { this.num = 3; (function() { console.log(this.num); this.num = 4; })(); console.log(this.num); }, sub: function() { console.log(this.num) } } myObject.add(); console.log(myObject.num); console.log(num); var sub = myObject.sub; sub();參考
你不知道的JavaScript上卷—筆記往期文章查看Javascript 閉包,引用的變量是否被回收?
【進階1-1期】理解JavaScript 中的執(zhí)行上下文和執(zhí)行棧
【進階1-2期】JavaScript深入之執(zhí)行上下文棧和變量對象
【進階1-3期】JavaScript深入之內(nèi)存空間詳細圖解
【進階1-4期】JavaScript深入之帶你走進內(nèi)存機制
【進階1-5期】JavaScript深入之4類常見內(nèi)存泄漏及如何避免
【進階2-1期】深入淺出圖解作用域鏈和閉包
【進階2-2期】JavaScript深入之從作用域鏈理解閉包
每周計劃安排每周面試重難點計劃如下,如有修改會通知大家。每周一期,為期半年,準備明年跳槽的小伙伴們可以把本公眾號[置頂]()了。
【進階1期】 調(diào)用堆棧
【進階2期】 作用域閉包
【進階3期】 this全面解析
【進階4期】 深淺拷貝原理
【進階5期】 原型Prototype
【進階6期】 高階函數(shù)
【進階7期】 事件機制
【進階8期】 Event Loop原理
【進階9期】 Promise原理
【進階10期】Async/Await原理
【進階11期】防抖/節(jié)流原理
【進階12期】模塊化詳解
【進階13期】ES6重難點
【進階14期】計算機網(wǎng)絡(luò)概述
【進階15期】瀏覽器渲染原理
【進階16期】webpack配置
【進階17期】webpack原理
【進階18期】前端監(jiān)控
【進階19期】跨域和安全
【進階20期】性能優(yōu)化
【進階21期】VirtualDom原理
【進階22期】Diff算法
【進階23期】MVVM雙向綁定
【進階24期】Vuex原理
【進階25期】Redux原理
【進階26期】路由原理
【進階27期】VueRouter源碼解析
【進階28期】ReactRouter源碼解析
交流本人Github鏈接如下,歡迎各位Star
http://github.com/yygmind/blog
我是木易楊,網(wǎng)易高級前端工程師,跟著我每周重點攻克一個前端面試重難點。接下來讓我?guī)阕哌M高級前端的世界,在進階的路上,共勉!
如果你想加群討論每期面試知識點,公眾號回復(fù)[加群]即可
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99548.html
摘要:箭頭函數(shù)的尋值行為與普通變量相同,在作用域中逐級尋找。題目這次通過構(gòu)造函數(shù)來創(chuàng)建一個對象,并執(zhí)行相同的個方法。 我們知道this綁定規(guī)則一共有5種情況: 1、默認綁定(嚴格/非嚴格模式) 2、隱式綁定 3、顯式綁定 4、new綁定 5、箭頭函數(shù)綁定 其實大部分情況下可以用一句話來概括,this總是指向調(diào)用該函數(shù)的對象。 但是對于箭頭函數(shù)并不是這樣,是根據(jù)外層(函數(shù)或者全局)作用域(...
摘要:首次運行代碼時,會創(chuàng)建一個全局執(zhí)行上下文并到當(dāng)前的執(zhí)行棧中。執(zhí)行上下文的創(chuàng)建執(zhí)行上下文分兩個階段創(chuàng)建創(chuàng)建階段執(zhí)行階段創(chuàng)建階段確定的值,也被稱為。 (關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo)) 本周正式開始前端進階的第一期,本周的主題是調(diào)用堆棧,,今天是第一天 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了解本進...
摘要:正在暑假中的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。原理微信熱更新方案漲知識了,熱更新是以后的標配。 正在暑假中的《課多周刊》(第1期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大的動力。 遠上寒山石徑...
摘要:正在暑假中的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。原理微信熱更新方案漲知識了,熱更新是以后的標配。 正在暑假中的《課多周刊》(第1期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大的動力。 遠上寒山石徑...
摘要:使用指定的參數(shù)調(diào)用構(gòu)造函數(shù),并將綁定到新創(chuàng)建的對象。由構(gòu)造函數(shù)返回的對象就是表達式的結(jié)果。情況返回以外的基本類型實例中只能訪問到構(gòu)造函數(shù)中的屬性,和情況完全相反,結(jié)果相當(dāng)于沒有返回值。 定義 new 運算符創(chuàng)建一個用戶定義的對象類型的實例或具有構(gòu)造函數(shù)的內(nèi)置對象的實例。 ——(來自于MDN) 舉個栗子 function Car(color) { this.color = co...
閱讀 2111·2021-11-11 16:54
閱讀 1079·2021-10-12 10:12
閱讀 413·2019-08-30 15:43
閱讀 682·2019-08-29 13:15
閱讀 1106·2019-08-29 13:12
閱讀 1558·2019-08-26 12:09
閱讀 1694·2019-08-26 10:24
閱讀 2304·2019-08-26 10:15