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

简介: 第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

相关文章
|
12天前
|
存储 缓存 JavaScript
哪些情况适合使用块级作用域,哪些情况适合使用函数作用域?
【10月更文挑战第29天】块级作用域和函数作用域在不同的场景下各有优势,合理地选择和运用这两种作用域可以使JavaScript代码更加清晰、高效和易于维护。在实际开发中,需要根据具体的业务需求、代码结构和编程模式来决定使用哪种作用域,或者在适当的情况下结合使用两者,以达到最佳的编程效果。
|
12天前
|
JavaScript 前端开发
块级作用域和函数作用域有什么区别?
【10月更文挑战第29天】块级作用域和函数作用域在JavaScript中各有特点和用途。块级作用域提供了更精细的变量控制,有助于避免变量提升和意外的全局变量污染等问题;而函数作用域则在函数封装和模块化编程等方面有着重要的应用。在实际开发中,需要根据具体的需求和场景合理地选择使用哪种作用域来声明变量和组织代码。
|
27天前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
3月前
函数声明与函数表达式的区别是什么?
函数声明与函数表达式的区别是什么?
36 0
|
6月前
|
C++
c++变量作用域
c++变量作用域
59 2
|
6月前
|
JavaScript
块级作用域、变量提升
块级作用域、变量提升
27 1
|
6月前
|
JavaScript 前端开发
函数声明与函数表达式的区别
函数声明与函数表达式的区别
27 2
|
6月前
|
C++
C++ 变量作用域
C++ 变量作用域
48 0
|
存储
函数声明与函数表达式的区别?
函数声明与函数表达式的区别?
33 0
|
JavaScript 前端开发 Go
立即执行函数
立即执行函数
58 0