1 function test2() {
2 var a = 1;
3 var b = 2;
4 var c = 3;
5 }
6 /*test2中的语句,是这样被执行的 这个时候就把变量提升了
7 8 function test2(){
9 var a,b,c;
10 var a = 1;
11 var b = 2;
12 var c = 3;
13 }
14 */
只有函数级作用域,if语句不会有:test3():
function test3(){ var a = 1; log(a); // 1 if (true) { var a = 2; log(a); //2 } log(a); // 2 }
1 function test3() {
2 fn();
3 function fn() {
4 log("我来自fn");
5 }
6 }
7 test3();
8 function test4() {
9 fn(); // fn is not a function
10 var fn = function fn() {
11 alert("我来自 fn test4");
12 }
13 }
14 test4();
函数表达式需要注意的
在function内部,fn完全等于fn1
在function外面,fn1则是 not defined
1 function test5() {
2 var fn = function fn1() {
3 log(fn === fn1); // true
4 log(fn == fn1); // true
5 }
6 fn();
7 log(fn === fn1); // fn1 is not defined
8 log(fn == fn1); // fn1 is not defined
9 }
10 test5();
!兼容 // b(); // var a = function b() {alert('this is b')}; // 则ie下是可以执行b的. 说明不同浏览器在处理函数表达式细节上是有差别的.
补充一点函数表达式
定义里面的指定的函数名是不是被提升的
1 function text7() {
2 a(); // TypeError "a is not a function"
3 b();
4 c(); // TypeError "c is not a function"
5 d(); // ReferenceError "d is not defined"
6
7 var a = function() {}; // a指向匿名函数
8 function b() {}; // 函数声明
9 var c = function d() {}; // 命名函数,只有c被提升,d不会被提升。
10
11 a();
13 b();
14 c();
15 d(); // ReferenceError "d is not defined"
16 }
17 text7();
大家先看下面一段代码test6,思考一下会打印什么?
1 function text6() {
2 var a = 1;
3 function b() {
4 a = 10;
5 return;
6 function a() {}
7 }
8 b();
9 log(a); // ?
10 }
11 text6();
||
||
||
|| 输出在下面
||
||
||
||
||
||
what? 什么鬼?为什么是1? 这里需要注意的是,在function b()中, var = a // function 类型的 a=10; // 重新把10复制给a, 此时的a是function b()中的内部变量 return; function a() {} // 不会被执行
所以,外面输出的a 依旧是最开始定义的全局变量
函数的声明比变量的声明的优先级要高
1 function text6() {
2 function a() {}
3 var a;
4 log(a); //打印出a的函数体
5
6 var b;
7 function b() {}
8 log(b); //打印出b的函数体
9
10 // !注意看,一旦变量被赋值后,将会输出变量
11 var c = 12
12 function c() {}
13 log(c); //12
14
15 function d() {}
16 var d = 12
17 log(d); //12
18 }
19 text6();