微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

第4章变量提升和函数的提升


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
https://www.cnblogs.com/hey-Sarah/p/13449699.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐