JavaScript中的變量提升和函數提升
前言
在js中對變量進行操作後打印值經常會出現undefined的現象。其實原因是因為js中有一個叫做變量提升的功
舉例:
var data="lyyyyy"; getData(); function getData(){ //第一次打印 console.log("data值為: ", data); var data="yyyyyyy"; //第二次打印 console.log("data值為: ", data); }
打印的值第一個為undefined,而第二個打印的值為yyyyy.
原因:
在執行getData()方法的時候會在函數內部首先將變量的聲明提升到第一步。然後再聲明函數內部的函數(如果函數內部有函數的話)。之後才會按照方法內部的邏輯先後順序執行代碼。前兩步隻是聲明!!!看到這裡應該就已經知道為什麼會有上面那樣的結果瞭。
實際的方法內部代碼執行順序應該是這樣的:
function getData(){ //一。聲明變量 var data; //二。聲明函數(如果函數內部有函數的話) //三。按照代碼的順序執行 console.log("data值為: ", data); data="yyyyyyy"; //第二次打印 console.log("data值為: ", data); }
看到拆分後的代碼執行順序對結果也就不迷茫瞭。
為什麼有變量提升
那麼為什麼會出現變量提升這個現象呢?
其實js和其他語言一樣,都要經歷編譯和執行階段。而js在編譯階段的時候,會搜集所有的變量聲明並且提前聲明變量,而其他的語句都不會改變他們的順序,因此,在編譯階段的時候,第一步就已經執行瞭,而第二步則是在執行階段執行到該語句的時候才執行。
javascript變量提升和函數提升
變量提升是把變量提升提到函數頂部。需要說明的是,變量提升隻是提升變量的聲明,並不會把賦值也提升上來。函數提升是把整個函數都提到前面去。函數表達式不能被提升,函數聲明形式能被提升。
<!DOCTYPE html> <html lang="en"> <head> </head> <body> <script> //變量提升 function test(){ a=2; var a; console.log(a); //2 } test(); //變量提升,不會把賦值也提升上來 var v='Hello World'; (function(){ var v; console.log(v); //undefined v='I love you'; })(); //函數聲明形式能被提升 function myTest(){ foo(); function foo(){ console.log("hello world"); //hello world } } myTest(); //函數表達式不能被提升 function myTest2(){ foo(); //foo is not a function var foo =function foo(){ console.log("hello world"); } } myTest2(); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> </head> <body> <script> //輸出Goodbye Jack var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); //輸出Hello World! var name2 = 'World!'; (function () { if (typeof name2 === 'undefined') { name2 = 'Jack'; console.log('Goodbye ' + name2); } else { console.log('Hello ' + name2); } })(); //輸出Hello World! var name3 = 'World!'; (function () { if (typeof this.name3 === 'undefined') { var name3 = 'Jack'; console.log('Goodbye ' + name3); } else { console.log('Hello ' + this.name3); } })(); </script> </body> </html>
總結
- 1.js會將變量的聲明提升到js頂部執行,因此對於這種語句:var a = 2;其實上js會將其分為var a;和a = 2;兩部分,並且將var a這一步提升到頂部執行。
- 2.變量提升的本質其實是由於js引擎在編譯的時候,就將所有的變量聲明瞭,因此在執行的時候,所有的變量都已經完成聲明。
- 3.當有多個同名變量聲明的時候,函數聲明會覆蓋其他的聲明。如果有多個函數聲明,則是由最後的一個函數聲明覆蓋之前所有的聲明。
到此這篇關於JavaScript中的變量提升和函數提升的文章就介紹到這瞭,更多相關js變量提升內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!