国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

幾句話帶你理解JS中的this、閉包、原型鏈

2019-11-20 08:52:56
字體:
供稿:網(wǎng)友

原型鏈

所有對象都是基于Object.prototype,Object.prototype就是JavaScript的根對象,在Object.prototype中定義的方法都可以被其它對象訪問到,當然也可以被重寫了,所以直接在Object.prototype上調(diào)用的是原始功能的toString()方法,該方法會放回參數(shù)對象的內(nèi)置屬性[[class]]的值,這個值是個字符串,比如'[Object String]'

要理解原型鏈機制的話,首先得知道根本原因:JavaScript中的對象都有一個內(nèi)置屬性[[Prototype]],這個屬性和非標準的__proto__屬性一樣,__proto__在ES6中被納入標準了,可以說它們基本上是等價的,但內(nèi)置屬性是無法訪問到的。對象之間通過內(nèi)置屬性[[Prototype]]關聯(lián)了起來就形成了原型鏈,而原型鏈的頂層就是根對象Object.prototype,Object.prototype的原型將是null,即Object.prototype.__proto__ === null;

例如:

在訪問對象的屬性的時候,如:obj.a,首先查找自身,沒有,就到它的內(nèi)置屬性[[Prototype]]所引用的對象上找,還是沒有,就繼續(xù)在這個上層對象的內(nèi)置屬性[[Prototype]]所引用的對象上找,一直找到根對象Object.prototype,找不到就返回undefined;

this

理解this的第一步就是要明白:this既不指向函數(shù)自身,也不指向函數(shù)的詞法作用域;

this是在運行時進行綁定的,而不是在編寫時綁定,它的上下文取決于函數(shù)調(diào)用時的各種條件;

this的綁定和函數(shù)聲明的位置沒有任何關系,只取決于函數(shù)的調(diào)用位置和調(diào)用方式;

this綁定規(guī)則有4點:按優(yōu)先級1到4判斷

1.由new調(diào)用?綁定到新創(chuàng)建的空對象;

2.由call、apply、bind調(diào)用?綁定到指定的參數(shù)對象;如foo.call(obj)

3.由上下文對象調(diào)用?綁定到這個上下文對象;如obj.foo()

4.默認情況下綁定到全局對象,foo();在嚴格模式下綁定到undefined;

閉包

function foo(){var a = 2;function bar(){}return bar;}var a = foo();a(); 

閉包:不是指函數(shù)bar也不是a,它是一個引用,這個引用被內(nèi)部函數(shù)bar持有,這個引用指向外部函數(shù)foo的整個作用域,它使得這個作用域即使在外部函數(shù)foo()執(zhí)行后也不會被垃圾回收器回收。也就是說這個外部函數(shù)foo的作用域就是閉包本身。
無論通過何種手段(直接或間接)將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執(zhí)行這個函數(shù)都會使用閉包。

var fn; //間接傳遞函數(shù)function foo(){var a = 2;function baz(){console.log(a);}fn = baz;}function bar(){ fn();}foo();bar(); function foo(){var a = 2;function baz(){console.log(a);}bar(baz);}function bar(fn){ fn(); }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 耿马| 抚顺县| 阿拉善左旗| 揭东县| 福建省| 容城县| 横山县| 静安区| 盈江县| 东乡县| 柘城县| 连州市| 湖南省| 德州市| 盘山县| 九台市| 丰顺县| 海盐县| 大庆市| 兴宁市| 方正县| 营山县| 芦溪县| 泽普县| 顺义区| 苏尼特右旗| 湖南省| 成武县| 信丰县| 牙克石市| 仙桃市| 兴国县| 抚顺县| 东乡族自治县| 瑞金市| 类乌齐县| 界首市| 绥江县| 通州市| 凉城县| 海林市|