问题一:
var a=10;
function fun(){
console.log(a); //1 返回undefined
a=100;
console.log(a); //2 返回100
var a=200;
console.log(a); //3 返回200
}
fun();
console.log(a); //4 返回10
执行步骤:
1.声明 fun() 。
2.声明var a,自动赋值undefined
3. 执行函数体{ 声明提前 var a,var a;自动赋值undefined;
打印第一条 a 返回undefined; (注意点:当函数体内变量名和函数体外的变量名重名,以函数体内为准, 一开始就是没注意到这点,以为第一个a 应该输出10.实际是输出undefined的。)
给a赋值 a=100;
打印第二条a ,返回100;
给a赋值 a=200;
打印第三条a ,返回200; }函数体内执行完
5. 函数体外的a赋值为10;
5. 打印第四条a为10;`
问题二
console.log(a); //1 返回 函数a(){...};
a(); //调用函数,返回10;
function a(){
console.log(10);
}
console.log(a); //2 依旧是返回函数a(){...}
a=6;
console.log(a); //3 返回6
a(); //返回a is not a function;
执行步骤:
1,函数声明提前 a(); 变量声明提前var a,自动赋值为undefined;
2. 第一条返回 function a(){…} 。(这个题目我主要纠结的点就在这里,为什么函数和变量申明都提前了,返回的却是函数,为什么不可以是变量的undefined???注意点:函数的声明提前是整体提前,变量的提前却只是声明提前,简单说,就是函数更高级一点,它比较牛逼。。。)
3. 后面的我是没什么疑问了。
4. 第2条和第三条输出本来是没有的,我是为了看这个函数到底有多牛逼自己加的。结果显示,一直到变量a被赋值为6后,输出的才不是函数了。
5. 最后a() ;这条语句,这个时候变量a已经翻身做老大了,所以再用函数的调用方法就会显示a不是应该函数。
学无止境,作为一个初学者更是问题多多啊,难受。。