函式變數提升易混淆題
1. a='哈哈';
var a = 5;
console.log(a);
結果為5 ,var a =5 會在開頭宣告var a ; 之後再是a=‘哈哈’ a=5;
2. var sum;
console.log(sum);
sum = function(){
console.log('我是函式表示式');
}
sum();
結果為undefined '我是函式表示式'
3. var sum = function(){
console.log('我是函式表示式方式');
}
sum();//輸出‘我是函式表示式方式’
sum = '哈哈';
sum();//報錯 因為這時候sum已經是字串‘哈哈’ 當做函式去呼叫必然報錯
4.sum = '哈哈';
function sum(){
console.log('我是函式表示式方式');
}
sum();//報錯 因為自定義函式可變數提升 相當於在第一行是 var sum ; sum=function(){ console.log('.....') };之後再是sum='哈哈' 最後一行是sum() 字串不能被當作函式呼叫 故報錯
5. var sum;
sum = 5;
sum = function (){
alert(111);
}
console.log(sum);
sum();
效果是執行函式顯示alert(....) 之後控制檯顯示函式體 邏輯是一次按順序執行的
6.
var a = 5;
function sum(){
var a = 3;
console.log(a);
}
sum();
console.log(a)
結果是 3 5 因為有自定義函式 故變數提升 相當於在第一行就是 var a ; a=function(){....} 之後是a =5; 所以先是函式內部 後是全域性變數
7.
if(true){
var a = 5;
}
console.log(a);
for (var i = 0; i < 3; i++) {
}
console.log(i);// 2 3
因為JS是弱型別語言 所以沒有塊級作用域 這個就不同於自定義函數了 不考慮變數提升 最後一個迴圈是在迴圈體之外 故為3
8.
var a = 5;
function sum(){
var a = 1;
console.log(a);
}
sum();
console.log(a);
結果是1 5 因為變數提升 先算函式 之後a的值改變為5
9.
var a = 5;
function sum(){
console.log(a);
var a = 1;
}
sum();
console.log(a);
結果是undefined 5 變數提升 先算自定義函式 則先在函式體內算 函式體內 相當於var a ; 之後console.log(a) 再之後是a = 1
所以函式執行起來時 是undefined 再之後是函式體之外的
10.
var a = 5;
function sum(){
console.log(a);
var a = 1;
console.log(a);
}
sum();
console.log(a);
結果是5 1 1 執行到函式體內時 先沒有在函式體有定義 則在全域性變數中找 有找到的var a =5 ;則第一個a取5 之後變為1 在之後在函式體之外 仍然為1 (此題超級有技術含量 小夥伴們多理解)
11.
function a(){
var a = 2;
};
a();
console.log(a)
結果顯示 函式體;a()直接跳過 因為裡面只有一個var a =2; 之後相當於自定義函式變數提升;
12.
a=1;
function a(){
var a = 2;
console.log(a)
};
console.log(a)
結果顯示 1 這時候函式已經賦值為1
13.
function a(){
var a = 2;
console.log(a)
};
a();
console.log(a) 結果顯示2 函式體 前一個2是指呼叫函式 但a本身並不受影響 仍然是函式體;
14.