最近看到一道某手機公司的校招前端筆試題,感受頗有意思。與你們分享一下
本文適合對於變量提高存疑的小夥伴們查看。前端
下列代碼輸出結果正確的是:()函數
var val = 12; function fun1(){ console. log(val); var val = 20; console.log(val); } fun1();
A.12 20code
B.12 12io
C.undefined 20console
D.20 undefinedfunction
毫無疑問這道題涉及到了變量提高。答案的第二項是20應該是沒有爭議的,至關於變量
var val=20; console.log(val);
定義一個變量,再輸出。
就是答案的第一項對於那些不太熟悉變量提高的人們很容易就會選錯,畢竟筆試
var val = 12; function fun1(){ console.log(val);//12 } fun1();
函數外部定義一個變量,函數內輸出值,沒什麼問題。
那若是題目是這樣呢:
var val = 12;
function fun1(){分享
console.log(val);//12 val = 20; console.log(val);//20
}
fun1();筆試題
函數外部定義一個變量,函數內部先輸出得12再從新進行賦值,再次輸出得20。
那麼咱們回到一開始的題目。
題目是這樣
下列代碼輸出結果正確的是:()
var val = 12; function fun1(){ console. log(val);//undefined var val = 20; console.log(val);//20 } fun1();
和上面比,不一樣的地方在於函數內部輸出過一次後又從新定義並賦值,雖然只是多了個val,但結果就不同了,他影響着第一個val的輸出值。
爲何第一個輸出值爲underfined,
其實上面的代碼等同於var val = 12;
function fun1(){ var val; console. log(val);//undefined val = 20; console.log(val);//20 } fun1();
因爲函數內從新定義val,致使變量val被提高到了頂端,但它被賦予的值並無提高,因此第一個console.log(val)輸出的只是定義過但沒有被賦值的val,第二個console.log輸出的是被賦值20的val。因此這道題的答案爲C。