函数,匿名函数新认知(与预解释、作用域的关系)
生活随笔
收集整理的這篇文章主要介紹了
函数,匿名函数新认知(与预解释、作用域的关系)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大家都應該知道j函數的2中寫法:
1 //函數聲明 2 function fun () { 3 return true; 4 }5 //匿名函數 or 函數表達式 or 函數變量化
6 var var2fun = function () {
7 return false;
8 }
可以這樣(函數變量化)大概是因為:js是弱類型語言,定義變量的時候只有一個var,為變量賦值時會自動判斷類型并進行轉換。 ? ? (提出一個問題!javascript在 var 時候做了什么!)
這里我們主要關注一下他們的區別吧!
大家都知道javascript是解釋性語言。以語句塊和語句行的形式邊讀取邊執行,雖然沒有編譯整個過程,但會有預解析(這個過程會在作用域內,把函數、變量前置)
?預解釋前置 ? ?(輸出代碼為追加的測試代碼)
var var2fun ; //預解析后 變量前置 具體的函數實現還是在相應位置的語句塊 //一般函數 function fun() {return true; }console.log(fun);//-->function fun() { return true;} console.log(var2fun);//--> undefined console.log(fun());//-->true console.log(var2fun());//--> 報錯了//函數變量化 var2fun = function () { returnfalse; }函數的 預解釋和閉包的關系
大家知道函數預解釋會前置,但是前置式有影響范圍的,前置只是在最接近的母體(作用域)里面前置。不會前置到母體的母體
function fun1() {return true; }//函數變量化 (function() {console.log("1"+fun1()); //->false fun1在這個函數母體內(預編譯前置)后返回falsefunction fun1 () {return false;}console.log("2"+fun1()); //->false 不用多說 })()console.log("4"+fun1()); //->true 在上母體是(閉包)環境 本作用域不受到影響 即返回true匿名函數的 預解釋和閉包的關系
上代碼和結果
var fun1 = function() {return true; }//函數變量化 ;(function () {console.log("1"+fun1); //->undefined fun1在這個函數母體內(預編譯前置) 會把 var fun1; 前置到閉包的前面,但是沒有賦值、也不會影響外部函數fun1console.log("1"+fun1()); //->error fun1 is not a function 雖然前置了var fun1 = function () {return false;}console.log("2"+fun1()); //->false 不用多說 })()console.log("4"+fun1()); //->true 在上母體是(閉包)環境?
語言表達水平匱乏啊!~
不知道大家明白了沒
簡單總結起來就是
1、js預編譯時候 ?會先定義變量,再預定義函數
2、變量只做聲明,不初始化;初始化在初始化語句執行時候。這個同時也適用于匿名函數的變量化。變量化的匿名函數會先聲明,不會初始化
3、函數的預解釋是在就近的作用域(母體)內,最后語句解釋也是在就近的作用域內
轉載于:https://www.cnblogs.com/liubl/p/5078745.html
總結
以上是生活随笔為你收集整理的函数,匿名函数新认知(与预解释、作用域的关系)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mycncart之微店管理功能
- 下一篇: LeetCode: 3_Longest