摘要:也就是說這個外部函數(shù)的作用域就是閉包本身。無論通過何種手段直接或間接將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會持有對原始定義作用域的引用,無論在何處執(zhí)行這個函數(shù)都會使用閉包。
以下是個人對這三個老大難的總結(jié)(最近一直在學習原生JS,翻了不少書,不少文檔,雖然還是新手,但我會繼續(xù)堅持走我自己的路)
原型鏈所有對象都是基于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]]關(guān)聯(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既不指向函數(shù)自身,也不指向函數(shù)的詞法作用域;
this是在運行時進行綁定的,而不是在編寫時綁定,它的上下文取決于函數(shù)調(diào)用時的各種條件;
this的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用位置和調(diào)用方式;
this綁定規(guī)則有4點:按優(yōu)先級1到4判斷
由new調(diào)用?綁定到新創(chuàng)建的空對象;
由call、apply、bind調(diào)用?綁定到指定的參數(shù)對象;如foo.call(obj)
由上下文對象調(diào)用?綁定到這個上下文對象;如obj.foo()
默認情況下綁定到全局對象,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(); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80487.html
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗Х妒?。函?shù)式編程是一種強調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:走在前端的大道上本篇是一篇文章帶你理解原型和原型鏈一篇文章帶你完全理解的查漏補缺,會不斷豐富提煉總結(jié)更新。 走在前端的大道上 本篇是 一篇文章帶你理解原型和原型鏈 、一篇文章帶你完全理解this的查漏補缺,會不斷豐富提煉總結(jié)更新。 什么是原型鏈 原型鏈 是針對構(gòu)造函數(shù)的,比如我先創(chuàng)建了一個函數(shù),然后通過一個變量new了這個函數(shù),那么這個被new出來的函數(shù)就會繼承創(chuàng)建出來的那個函數(shù)的屬性...
摘要:因為一旦代碼丟出來了,還會涉及到繼承,構(gòu)造函數(shù),原型鏈,閉包等一系列問題在后面等著你,面試管為了掏你的底細會一問再問,問到你懵逼。不可以當作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會拋出一個錯誤。 上一篇2018年3月面試心得《跨域問題》 話說我在面試的時候,有那么幾天,不知道是中了什么邪,面試的幾家公司開始瘋狂的問我this,各種的this,繞著彎的問我this,后來我做夢都是thi...
閱讀 1206·2021-11-24 09:39
閱讀 2129·2021-11-22 13:54
閱讀 2111·2021-09-08 10:45
閱讀 1443·2021-08-09 13:43
閱讀 2985·2019-08-30 15:52
閱讀 3083·2019-08-29 15:38
閱讀 2848·2019-08-26 13:44
閱讀 3055·2019-08-26 13:30