a = 2; var a; console.log(a);//输出的是2 // 它等价于 var a; a=2; console.log(a);//2 ================ console.log(a) var a=2;//输出undefined 等价于 var a; console.log(a) a=2;
因为var具有提升;
提升:在预编译阶段,编译器会把所有定义的变量提升到最顶部,但是值还是保留在原来的位置上;
foo(); function foo(){ console.log(a);//输出undefined var a=2; } 等价于 function foo(){ var a; console.log(a);//输出undefined a=2; } foo();
说明了函数声明,和var 声明的变量都有提升;
foo(); var foo=function bar(){ //do something() }
因为这是一个函数表达式;函数表达式不会被提升,所以会报错;
函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量
foo(); var foo; function foo(){ console.log(1); } foo=function(){ console.log(2); }
等价于
function foo(){ console.log(1); } foo(); //输出1 var foo; foo=function(){ console.log(2); }
var a = 10; function a() {}; console.log(typeof a);//number
它等价于
function a() {}; var a = 10; console.log(typeof a);//number
因为:函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量
console.log(a); //f a(){console.log('hi');} console.log(b); //undefined function a() { console.log('hi'); } var b = function() { console.log('ok'); }
它等价于
function a() { console.log('hi'); } var b;//undefined; console.log(a); //f a(){console.log('hi');} console.log(b); //undefined b = function() { console.log('ok'); }
记住预编译
二者优先级:函数提升会优先于变量提升,而且不会被同名的变量覆盖.
但是,如果这个同名变量已经赋值了,那函数变量就会被覆盖。
当二者同时存在时,会先指向函数声明。
console.log(a); //f a() {...} console.log(a()); //2 var a = 1; function a() { console.log(2); } console.log(a); //1 a = 3; console.log(a()); //报错,现在的函数a已经被赋值过后的变量a给覆盖了,无法再调用a()
等价于
function a() { console.log(2); } var a; console.log(a); //f a() {...} console.log(a()); //2 a = 1; //同名变量已经赋值了,那函数变量就会被覆盖。 console.log(a); //1 a = 3; console.log(a()); //报错,现在的函数a已经被赋值过后的变量a给覆盖了,无法再调用a()
在读第4章的时候,提升这一章的时候,我就比上一章好些,很多地方都懂,
淡然这一章节一点都不难,我之前也很清楚这一章。
但是还有一个地方不是特别的懂!
参考的地址
https://blog.csdn.net/sunlizhen/article/details/99844964