摘要:也就是說(shuō)這個(gè)外部函數(shù)的作用域就是閉包本身。無(wú)論通過(guò)何種手段直接或間接將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會(huì)持有對(duì)原始定義作用域的引用,無(wú)論在何處執(zhí)行這個(gè)函數(shù)都會(huì)使用閉包。
以下是個(gè)人對(duì)這三個(gè)老大難的總結(jié)(最近一直在學(xué)習(xí)原生JS,翻了不少書(shū),不少文檔,雖然還是新手,但我會(huì)繼續(xù)堅(jiān)持走我自己的路)
原型鏈所有對(duì)象都是基于Object.prototype,Object.prototype就是JavaScript的根對(duì)象,在Object.prototype中定義的方法都可以被其它對(duì)象訪問(wèn)到,當(dāng)然也可以被重寫(xiě)了,所以直接在Object.prototype上調(diào)用的是原始功能的toString()方法,該方法會(huì)放回參數(shù)對(duì)象的內(nèi)置屬性[[class]]的值,這個(gè)值是個(gè)字符串,比如"[Object String]"
要理解原型鏈機(jī)制的話,首先得知道根本原因:JavaScript中的對(duì)象都有一個(gè)內(nèi)置屬性[[Prototype]],這個(gè)屬性和非標(biāo)準(zhǔn)的__proto__屬性一樣,__proto__在ES6中被納入標(biāo)準(zhǔn)了,可以說(shuō)它們基本上是等價(jià)的,但內(nèi)置屬性是無(wú)法訪問(wèn)到的。對(duì)象之間通過(guò)內(nèi)置屬性[[Prototype]]關(guān)聯(lián)了起來(lái)就形成了原型鏈,而原型鏈的頂層就是根對(duì)象Object.prototype,Object.prototype的原型將是null,即Object.prototype.__proto__ === null;
例如:
在訪問(wèn)對(duì)象的屬性的時(shí)候,如:obj.a,首先查找自身,沒(méi)有,就到它的內(nèi)置屬性[[Prototype]]所引用的對(duì)象上找,還是沒(méi)有,就繼續(xù)在這個(gè)上層對(duì)象的內(nèi)置屬性[[Prototype]]所引用的對(duì)象上找,一直找到根對(duì)象Object.prototype,找不到就返回undefined;
理解this的第一步就是要明白:this既不指向函數(shù)自身,也不指向函數(shù)的詞法作用域;
this是在運(yùn)行時(shí)進(jìn)行綁定的,而不是在編寫(xiě)時(shí)綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件;
this的綁定和函數(shù)聲明的位置沒(méi)有任何關(guān)系,只取決于函數(shù)的調(diào)用位置和調(diào)用方式;
this綁定規(guī)則有4點(diǎn):按優(yōu)先級(jí)1到4判斷
由new調(diào)用?綁定到新創(chuàng)建的空對(duì)象;
由call、apply、bind調(diào)用?綁定到指定的參數(shù)對(duì)象;如foo.call(obj)
由上下文對(duì)象調(diào)用?綁定到這個(gè)上下文對(duì)象;如obj.foo()
默認(rèn)情況下綁定到全局對(duì)象,foo();在嚴(yán)格模式下綁定到undefined;
閉包function foo(){ var a = 2; function bar(){} return bar; } var a = foo(); a();
閉包:不是指函數(shù)bar也不是a,它是一個(gè)引用,這個(gè)引用被內(nèi)部函數(shù)bar持有,這個(gè)引用指向外部函數(shù)foo的整個(gè)作用域,它使得這個(gè)作用域即使在外部函數(shù)foo()執(zhí)行后也不會(huì)被垃圾回收器回收。也就是說(shuō)這個(gè)外部函數(shù)foo的作用域就是閉包本身。
無(wú)論通過(guò)何種手段(直接或間接)將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會(huì)持有對(duì)原始定義作用域的引用,無(wú)論在何處執(zhí)行這個(gè)函數(shù)都會(huì)使用閉包。
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(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/80487.html
摘要:既然構(gòu)造函數(shù)有屬于自己的原型對(duì)象,那么我們應(yīng)該能讓另一個(gè)構(gòu)造函數(shù)來(lái)繼承他的原型對(duì)象咯我們?cè)跇?gòu)造函數(shù)內(nèi)部執(zhí)行了函數(shù)并改變了函數(shù)內(nèi)部的指向其實(shí)這個(gè)指向的是實(shí)例化之后的對(duì)象。 我們?cè)谟懀╩ian)論(shi)JavaScript這門(mén)語(yǔ)言時(shí),總是繞不過(guò)的一個(gè)話題就是繼承與原型鏈。那么繼承與原型鏈到底是什么呢? 我很喜歡的一個(gè)聊天模式是:我不能說(shuō)XX是什么,我只能說(shuō)XX像什么。也就是說(shuō)我不直接跟...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠?lái)都是中的主導(dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠?lái)都是JavaScript中的主導(dǎo)范式。JavaScript作為一門(mén)多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來(lái)越多得受到開(kāi)發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:走在前端的大道上本篇是一篇文章帶你理解原型和原型鏈一篇文章帶你完全理解的查漏補(bǔ)缺,會(huì)不斷豐富提煉總結(jié)更新。 走在前端的大道上 本篇是 一篇文章帶你理解原型和原型鏈 、一篇文章帶你完全理解this的查漏補(bǔ)缺,會(huì)不斷豐富提煉總結(jié)更新。 什么是原型鏈 原型鏈 是針對(duì)構(gòu)造函數(shù)的,比如我先創(chuàng)建了一個(gè)函數(shù),然后通過(guò)一個(gè)變量new了這個(gè)函數(shù),那么這個(gè)被new出來(lái)的函數(shù)就會(huì)繼承創(chuàng)建出來(lái)的那個(gè)函數(shù)的屬性...
摘要:因此,就會(huì)形成一個(gè)原型鏈對(duì)象到原型,再到原型的原型如果一層層地上溯,所有對(duì)象的原型最終都可以上溯到,即構(gòu)造函數(shù)的屬性。 對(duì)于很多前端開(kāi)發(fā)者而言,JavaScript中原型與原型鏈?zhǔn)且粋€(gè)比較容易疑惑的點(diǎn),所以本文記錄了自己對(duì)應(yīng)這方面的一點(diǎn)理解,以后有更深的理解再來(lái)更新。 對(duì)象 想要了解原型與原型鏈,首先要了解什么是對(duì)象?面向?qū)ο缶幊蹋∣bject Oriented Programmin...
摘要:因?yàn)橐坏┐a丟出來(lái)了,還會(huì)涉及到繼承,構(gòu)造函數(shù),原型鏈,閉包等一系列問(wèn)題在后面等著你,面試管為了掏你的底細(xì)會(huì)一問(wèn)再問(wèn),問(wèn)到你懵逼。不可以當(dāng)作構(gòu)造函數(shù),也就是說(shuō),不可以使用命令,否則會(huì)拋出一個(gè)錯(cuò)誤。 上一篇2018年3月面試心得《跨域問(wèn)題》 話說(shuō)我在面試的時(shí)候,有那么幾天,不知道是中了什么邪,面試的幾家公司開(kāi)始瘋狂的問(wèn)我this,各種的this,繞著彎的問(wèn)我this,后來(lái)我做夢(mèng)都是thi...
閱讀 1287·2021-11-24 09:39
閱讀 2211·2021-11-22 13:54
閱讀 2256·2021-09-08 10:45
閱讀 1525·2021-08-09 13:43
閱讀 3042·2019-08-30 15:52
閱讀 3169·2019-08-29 15:38
閱讀 2903·2019-08-26 13:44
閱讀 3114·2019-08-26 13:30