函式內定義函式產生閉包時, 被儲存的是內部函式的用到的自由變數還是內部函式定義時的環境

時間 2021-05-29 22:46:09

1樓:卞舒言

唉, js抄scheme答案沒抄對. eval是函式, 按照原則, 當然也要respect靜態作用域, 你以為eval的環境是什麼, 看過SICP的Schemer才不會問這種問題呢. 按照Scheme的設計原則, 做正確的事情, 這裡x肯定是未定義的.

js這麼設計明顯是有問題的.

閉包, 或者說, 扁平閉包, 是乙個概念上相當簡單直接的東西. 就是乙個指向lambda的指標和乙個vector, vector裡是引用的自由變數的值, 甚至要取的值在vector的什麼地方, 提前確定都是毫不複雜的事情.

我懷疑就是因為許多語言設計時根本沒有respect靜態作用域原則, 才會導致一堆人理解的閉包時錯誤的.

2樓:Belleve

翻了 ES5 規範,是定義時的環境。Harmony 也一樣:JS 這種帶 eval 的語言也只能靠存環境本身來實現靜態作用域(否則 eval 保證語義不對),當然要是沒 eval 完全可以用到哪個自由變數就存哪個。

3樓:Saviio

閉包是一種捕獲了環境中自由變數的引用的函式,同時這個自由變數同函式一起存在。

換言之,使用閉包建立的函式可以「記住」它被建立時所處的環境。

每執行乙個可執行的函式體都會進入乙個執行環境(Execution context),而具體的執行環境中會有如下的元素

在Spec的定義中,函式之所以得以向上級作用域訪問變數,得益於Scope chain物件,詞法閉包可以通過其來獲得上級作用域的引用,但是具體到直譯器級別的實現上則可能是捕獲作用域中的自由變數的引用來實現。

第乙個問題,如徐釀泉所言,具體到應用級別的細節取決於語言的直譯器如何實現。

其次,哪怕在父級作用域中定義了多個變數,在具體的應用中直譯器也會對其「環境」中的變數進行優化,在諸如Chakra、V8、SpiderMonkey等實現中,那些沒有被閉包引用的變數會在函式結束後解除繫結(或者賦值為undefined)並且被GC。

第三,對,是因為eval的緣故,因為eval在local的作用域中執行會阻止很多優化,因此在作用域中不對任何變數進行解除繫結的操作,以避免產生不可預料且不期待的結果。

函式連續時,如何證明凹凸函式定義的等價性

予一人 當前的問題是要證明 定義1稱為區間 的凸函式,當且僅當 都有 與定義2稱為區間 的凸函式,當且僅當 以及 都有 在 連續的前提下等價,這就要求,在連續的前提下 證明定義2定義1 這是顯然的。只要在定義2中命 即證 同時 證明定義1定義2 這需要花費一點力氣,我們分三步走。第一步,證明定義1中...

學習matlab的fft函式時,產生了以下疑惑,應該怎麼解決呢?

易夕 所有問題都可以用一句話回答,因為你的取樣頻率設定的太小了,導致訊號失真。取樣頻率必須超過訊號中最高分量頻率的兩倍。forn 1 64X n sin 2 pi 50 0.02 64 n 1 0.5 sin 40 2 pi 50 0.02 64 n 1 1.5 end 看一下X n 的影象 plo...

如何解決Python定義函式時傳參遇到的問題?

只增笑耳Jason 直觀點的做法可以這麼來。deftest html,a kwargs soup BeautifulSoup html,a kwargs 呼叫 d test html,a d 我算是明白題主想要什麼了,現在深夜,手機打字不方便,我明天白天幫你改改你的test resolvewang ...