「人啊,認識你自己吧!」 這是太陽神阿波羅神廟的銘文,刻於西元前900年。
自己是誰?但凡做事情、想東西都需要乙個主體,這個主體往往就是自己。當然,人們不需要清楚自己,也可以做事情、想東西。this是啥?但凡取數值、調方法都需要乙個主體,這個主體往往就是this。同樣,開發者也許並不了解,但同樣能取數值、調方法。
我曾經就是這樣的開發者,所以今天找了些資料,希望有所改善。
上下文就像乙個容器,用來儲存當前上下文中所有已定義或可獲取的變數、函式等。位於最頂端的上下文稱為全域性上下文,如node中的global和browser中的window;作用域鏈實際上就是自下而上地將所有巢狀定義的上下文所繫結的變數物件串接到一起,使巢狀的function可以「繼承」上層上下文的變數,而並列的function之間互不干擾。
1、入棧:每個function開始執行,就會產生乙個新的上下文,它會被壓入js的上下文堆疊中;
2、傳值:繫結該上下文的變數物件,其中包括arguments和該函式中定義的變數(變數提公升);
3、繼承:建立新的物件,把函式的prototype傳遞給該物件的__proto__,並返回該物件(this);
4、出棧:function執行結束後則被彈出,因此js直譯器總是在棧頂上下文中執行;
入棧和出棧容易理解,因為js是單執行緒的。arguments是形參,它記錄呼叫者傳遞過來的實參。
var obj ={};//建立空物件
obj.__proto__ = myfunc.prototype;//
將這個空物件的__proto__成員指向了建構函式物件的prototype成員物件
myfunc.call(obj);//
將建構函式的作用域賦給新物件
return obj//
返回新物件obj
實際上這個返回的新物件,對於所有函式成員(變數或者方法)來說,就是this。
好了,現在我們知道函式新建和執行時發生了什麼,下面來考慮一種特殊情況:巢狀定義function,並返回function首先,返回的function所包含的作用域鏈將會一起返回;
然後,內層function可以在其他上下文中執行,其作用域鏈仍然保持原來的資料;
再後,當前的上下文可能無法獲取外層function中的資料(內層function儲存的那些);
最後,資料即所謂的自由變數,使得function內部的作用域鏈被保護起來,從而形成「閉包」。
使用this時了能會猜到的坑,以及解決方案:傳送門本文側重的是原理,而非例項,順便把前面的收穫串起來當作複習。
你就是我的眼我就是你的腿
如果我看不見了,你就是我的眼 如果你走不動了,我就是你的腿。50年前,一對遭遇不幸的戀人相互安慰著。那時,他拼死拼活賺下了一大筆錢。他要用親手建好的村子裡第一座寬敞明亮的磚瓦房,來迎娶深愛著的她。在修建過程中,慘劇發生了,一根近10公尺高的石柱轟然倒下,眼看石柱正不偏不倚砸向了她,而她竟嚇得呆住了。...
你要學習,你要學習,你要學習
寂寞乙個人早起晚睡不難,但在一群晚起早睡的人中早起晚睡不簡單。沒人陪你佔座,沒人陪你背書,沒人陪你寫作。學習就是孤獨的。食堂,寢室,教室,你就只能去這三個地方 廁所你都要算好時間再去 沒人經常簡訊你,沒人經常鼓勵你,沒人一直關注你 不管是打雷下雨下雹子還是刀子。都要早起前行去學習,你的夥伴會貪睡不去...
我就是要積分而已
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 據說寫部落格就可以獲得10積分,我來看看是不是這麼簡單就可以了。這裡寫自定義目錄標題 你好!這是你第一次使用markdown編輯器所展示的歡...