1. 程式人生 > 實用技巧 >C. Binary String Reconstruction

C. Binary String Reconstruction

識別符號提升

首先糾正下,“變數提升” 是隨大流叫法,“變數提升” 改為 “識別符號提升” 更準確。
因為變數一般指使用 var 宣告的識別符號,JS 裡使用 function 宣告的識別符號也存在提升(Hoisting)。
JS 存在變數提升,這個的設計其實是低劣的,或者是語言實現時的一個副作用。它允許變數不宣告就可以訪問,或宣告在後使用在前。新手對於此則很迷惑,甚至許多使用JS多年老手也比較迷惑。
在 ES6 加入 let/const 後,變數Hoisting 就不存在了。

在js中只有兩種作用域,全域性作用域和函式作用域,在ES6之前,js是沒有塊級作用域。

#JavaScript 程式碼的執行分為兩個階段。
第一個階段在當前詞法環境中註冊所有的變數和函式宣告,簡單說就是,解析,解析完成之後,第二個階段的 JavaScript 執行就開始了!

#JS中建立函式有兩種方式:
函式宣告式和函式字面量式。只有函式宣告才存在函式提升。

JavaScript 僅提升宣告,而不提升初始化。如果你先使用的變數,再宣告並初始化它,變數的值將是 undefined。

1:所有的宣告都會提升到作用域的最頂上去。

2:同一個變數只會宣告一次,其他的會被忽略掉。

3:函式宣告的優先順序高於變數申明的優先順序,並且函式宣告和函式定義的部分一起被提升。

變數提升的例子:

num 
= 6; var num = 7; var num; console.log(num); // 不報錯,輸出7,也證明了變數只會宣告一次,其他的會被忽略。 函式提升的例子: catName("Chloe");// 即使在宣告之前呼叫依然可以執行,不會報錯 function catName(name) { console.log("我的貓名叫 " + name); } 在定義的函式名字和變數名相同的情況下,函式提升優先順序高於變數的例子: func(); // 1 var func; function func() { console.log(1); } func = function
() { console.log(2); } 輸出1,不會輸出2。函式宣告和變數宣告都會被提升,但是需要注意的是函式會先被提升,然後才是變數。 var func;儘管出現在function func()之前,但它是重複的宣告,會被忽略,因為函式宣告會被提升到普通變數之前。 等同於這樣: function func() { console.log(1); } func(); // 1 func = function() { console.log(2); } 牢記這三點: 只有宣告本身會被提升,而賦值操作不會被提升。 變數會提升到其所在函式的最上面,而不是整個程式的最上面。 函式宣告會被提升,但函式表示式不會被提升。

轉載於:https://blog.csdn.net/qq_33505829/article/details/86158287