JS之變量提升

前言:學習JS逆向的時候,看到一篇很不錯的文章,就是粗略講解JS變量提升這個點,也轉載一下,當做是記錄吧,以後有需要可以隨時回頭翻閱

首先 javascript 是一種弱類型、動態的、解釋型的腳本語言。

弱類型:類型檢查不嚴格,偏向於容忍隱式類型轉換。
強類型:類型檢查嚴格,偏向於不容忍隱式類型轉換。
動態類型:運行的時候執行類型檢查。
靜態類型:編譯的時候就知道每個變量的類型。
解釋型:程序不需要編譯,程序在運行的時候才翻譯成機器語言,每執行一次都要翻譯一次,因此效率比較低,但是跨平臺性好。
編譯型:程序在執行之前需要一個專門的翻譯過程,把程序編譯爲機器語言的文件,運行時直接使用編譯的結果就行了。
標記語言:標記語言的存在就是用來被讀取(瀏覽)的,而其本身是沒有行爲能力的,在標記語言裏你會看到<和>這些尖括號,這是用來寫出“層次”和”屬性”的,換句話說,它是被動的。並不具備與訪問者互動的能力。
編程語言:它是具有邏輯性和行爲能力,這是主動的。說通俗一點,它是有思想的。

腳本語言:它介於標記語言和編程語言之間,腳本語言不需要編譯,可以直接用,由解釋器來負責解釋。

js代碼解析原則

首先js引擎在讀取js代碼時會進行兩個步驟,第一個步驟是解釋,第二個步驟是執行。
所謂解釋就是會先通篇掃描所有的Js代碼,然後把所有聲明提升到頂端,第二步是執行,執行就是操作一類的。

例子1

<script type="text/javascript">

    console.log(a);//輸出結果 undefined
    var a=10;
</script>

以上代碼輸出 undefined
原因: 變量提升(把變量聲明提升到當前執行環境的最頂端)
上段代碼相當於:
var a;
console.log(a);//由於未賦值 所以輸出undefined
a=10;

例2:

foo();
function foo(){
     console.log("aaa");
 }

結果輸出: aaa
原理:函數聲明提升 (函數聲明提升直接把整個函數提到執行環境的最頂端)

相當於:

function foo(){
    console.log("aaa");
}

foo();

變量提升只提升函數名 而函數提升會提升整個函數題 注意:函數提升在變量提升上面。

例3:

foo();
var foo = function(){
    console.log("aaa");
}

運行結果是: foo is not a function

原因: 還是進行了變量提升
相當於:

var foo;
console.log(foo);  //undefined
foo(); //foo is not a function
foo = function(){
    console.log("aaa");
}

上面代碼輸出undefined 是因爲變量提升後並沒有賦值因此輸出undefined

輸出foo is not a function 原因是:js解析遇到 foo()時會默認當做函數來解析

例4:

console.log(foo);
var foo=10;
console.log(foo);
function foo(){
    console.log(10);
}
console.log(foo);

輸出結果:
js變量提升

原理:
相當於:

function foo(){
        console.log(10);
    }
var foo;
console.log(foo);
foo=10;
console.log(foo);
console.log(foo);

注意: 函數提升在變量提升上面,第一個console.log(foo);爲什麼會輸出函數題呢,原因在於 var foo; 並未有賦值只是聲明,因此他會調用上面的值

例如:

var b=10;
b=10;
console.log(b); //10 輸出上一個值不會輸出undefined

但是更改後:

var b=10;
b=20;
console.log(b); //20 輸出20不是上一個值
總結:關於變量提升,一定要注意細心思考一下,還有就是要牢記函數提升在變量提升之上

0xFF、最後,希望能夠幫助到各位在爬蟲路上的小夥伴們,覺得不錯點個讚唄

感謝認真讀完這篇教程的您

先別走唄,這裏有可能有你需要的文章:

CSS字體反爬實戰,10分鐘就能學會
woff字體反爬實戰,10分鐘就能學會(ttf字體同理);
爬蟲:js逆向目前遇到的知識點集合;
woff字體反爬實戰,10分鐘就能學會;
爬蟲js解密分析:某某貓小說;
爬蟲js解密分析:某某雲文學;
個人總結-js逆向解析思路;

發佈了21 篇原創文章 · 獲贊 60 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章