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.