有沒有發現在寫**的時候,往往會遇到一些莫名其妙的錯誤,然後時間緊急不得不去網上查閱一些**。雖然要實現的功能解決了,但是看被拷貝的**好多真心看不懂,以後遇到諸如此類的問題,如果查閱不到這些**的話還是不會。所以今天給大分享一下內部原理的問題
###1.js編譯器編譯的幾條基本原則
>a.js預編譯:解釋函式宣告,忽略表示式;
>b.執行期間獲取變數會有底層向頂層依次查詢,直到找到為止(華續以前已經分享過);
>c.變數的定義會被提前到body下,即所屬**最前面宣告;
>d.function func(){}這種宣告會被js編譯器解釋成var func = function(){}這種格式,是不是看了幾條規則,不知道我說的什麼,沒關係,可能我總結的不好,看下面例子具體了解下
###2.自執行函式/閉包
>自執行函式,相信大家都接觸過,只是不知道而已,在此不給出具體文字定義。
>簡單解釋為:`類似(function())()這種形式的**就叫做自執行函式,又稱閉包`他在js編譯器解析到時,直接被執行。乙個簡單小例子: (function()
>)()可以被自執行,寫成function()()可以被自執行嗎,答:不可以!
>如上面所說`規則a`,js預編譯時,先解釋函式宣告,因此function()()前面的function()在『預編譯階段』已經被解釋成變數過了,js會跳過這段**,試圖去執行()裡的內容,顯然不科學;
> 而(function())()可以被自執行,因為它加了括號,它變成表示式了,js執行時會執行並對它求解得到乙個返回值,而此處返回值是乙個函式,故而遇到()便會執行
>###例1:
a=1;
console.info(a)
function b();
b();
控制台列印:
1,undefined,10
你是不是預期是1,1,10,這裡正是因為上面的`規則c`當js編譯器在執行這個b函式的時候,會把把它body裡面的宣告變數提前到最前面進行宣告。如:var a=10; 編譯器先會在 body最前面進行var a 宣告。其實上面的**等同於下面的這段**:
a=1;
console.info(a)
function b();
b();
宣告a的時候還沒有值,故而列印undefined;再看下面乙個例子...
###例2:
a=1;
function b();
};b();
console.info(a);
控制台輸出:1
這裡是因為上面的`規則b,d`在b函式中function a(){}實際是被編譯成var a = function(){},函式內部有乙個a=10,外部有乙個a=1,先找內部的a,找到不會向外找,而根據js 作用域,最終列印1;
###3.使用場景
有了上面的理論知識,可以解決曾經有人問我三元表示式後面怎麼執行多條語句的問題,就是在後面寫自執行函式。當然,不排除有其它方法,**如下:
var a = 2>1?(function())():(function())();
console.info(a);
控制台列印:3
這種需求應該很少吧,我寧願寫個if,不過可以實現,呵呵...
python中一些簡單的vim編譯器命令
i 在游標當前字元前插入內容 i 在游標所在行首插入內容 a 在游標字元後插入內容 a 在游標所在行尾插入內容 o 在游標處向下新開一行並在行首插入內容 o 在游標處向上新開一行並在行首插入內容 h 左移乙個字元 j 下移一行 k 上移一行 l 右移乙個字元 m 把游標定位在當前螢幕中間行第一字元處...
vs編譯器一些常見錯誤
編譯器出現 error lnk2026 模組對於 safeseh 映像是不安全的。錯誤時,在 專案 屬性 聯結器 命令列 中輸入 safeseh no 即可。控制台專案,編譯器出現 error lnk2019 無法解析的外部符號 winmain 16,該符號在函式 中被引用,在專案 屬性 聯結器 系...
讓編譯器對一些警告閉嘴
1 方法啟用告警 pragma clang diagnostic push pragma clang diagnostic ignored wdeprecated declarations code這裡插入相關的 pragma clang diagnostic pop 2.不相容指標型別 pragm...