var声明与变量提升

https://blog.csdn.net/er_fan/article/details/84139372
变量声明
JavaScript中,使用一个变量之前,先用var关键字声明它,变量如果没有赋值,则初始化值为undefined
声明变量时,如果不写var,则会被定义为全局变量,而且并不是在函数内部写了变量,这个变量就属于这个函数的作用域;必须用var来声明,这个变量才会属于这个作用域
作用域
一个变量的作用域就是变量起作用的范围区间。在ES5中,js只有两种形式的作用域:全局作用域和函数作用域
函数允许访问函数外的变量,代码中只有函数才可以限定作用域
当前函数作用域中的变量能覆盖全局作用域中的同名变量
分析作用域首先理解变量提升规则
变量提升
var关键字声明的变量,无论实际声明的位置在何处,都会被视为声明在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部)
JavaScript引擎的工作方式是,先预解析代码, 获取所有被声明的变量和函数声明,然后再一行一行地运行,这就使所有变量声明的语句,都会被提升到代码的头部,这就是变量提升

  1. console.log(a); //undefined
  2. var a = 1;
  3. console.log(a); // 1

上面代码首先在控制台显示未声明的变量,本来是错误的做法但是没有报错.因为JS的变量提升.真正运行的是以下代码

  1. var a ;
  2. console.log(a);
  3. a = 1;
  4. console.log(a);

在ES5中,js只有两种形式的作用域:全局作用域和函数作用域
全局作用域其实是全局对象的作用域,任意地方都可以访问到(如果没有被函数作用域覆盖)

  1. var i = 2; //全局变量,全局作用域
  2. function outer(){ //定义外部函数
  3. console.log(i); //访问全局变量 2
  4. function inner(){ //定义内部函数
  5. console.log(i); //访问全局函数 2
  6. }
  7. inner();
  8. }
  9. outer();
  10. console.log(i); //2

函数内部定义变量时,如果不写var,比如下面的x = 8,则会被定义为全局变量,作用域为全局作用域,在声明语句后的任何位置都可以访问,否则为局部变量,则作用域为函数作用域.

  1. function getResult(){ //定义外部函数
  2. var c = 4; //定义局部变量
  3. function open(){ //定义内部函数
  4. x = 8;
  5. var y = 9;
  6. console.log(c); // 访问函数外部的局部变量 4
  7. }
  8. open();
  9. console.log(x);
  10. //console.log(y); //局部变量.访问不了,报错未定义
  11. }
  12. getResult();
  13. console.log(x);
  14. //console.log(y); //局部变量.访问不了,报错未定义

函数提升
函数的定义:
函数表达式 var f1 = function(){ alert();} //匿名方式
声明式函数 function f2(){ alert();} //命名方式 先于函数执行 代码被解析器解析
1)函数表达式中的函数声明不会被提升,变量会被提升,如上面的举例代码
2)声明式函数中,函数同名,函数全部提升,后者覆盖前者

  1. var p = 1;
  2. function add(num){
  3. return num = num + 1;
  4. }
  5. y = add(p);
  6. function add(num){
  7. return num= num+ 2;
  8. }
  9. z = add(p);
  10. console.log(y); //3
  11. console.log(z); //3

3)如果有变量和函数同名,则会忽略掉变量,只提升函数

  1. console.log(foo); // foo(){ }
  2. function foo(){ }
  3. var foo = 2;
  4. console.log(foo); // 2

等价于

  1. function foo(){ }
  2. console.log(foo); // foo(){ }
  3. var foo = 2;
  4. console.log(foo); // 2

————————————————
版权声明:本文为CSDN博主「小帆帆~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/er_fan/article/details/84139372