变量声明提升
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。

先看看如下代码:

a = 132;
console.log(a);//132
var a;

当然在js中这个是不会报错且可以输出的,因为js并不是严格意义上的自上而下执行的。

再看看这个代码

fun();
fun2();

//使用函数声明形式
function fun(){

console.log("我是fun");
}

//使用函数表达式创建
var fun2=function(){

console.log("我是fun2");
}

输出结果:
函数表达式.png

所以总结如下

  • 变量的声明提前

使用var声明的变量会在所有的代码执行前就执行,但不会赋值,但是声明变量如果不适用var关键词,则变量不会被提前声明。

  • 函数的声明提前

使用函数声明形式-->function fun(){}这样的形式创建的函数,也和变量的声明提前一样在代码创建之前就会被声明创建,所以可以在函数声明前的位置调用函数,而使用函数表达式创建的函数就不具备这个性质

作用域

  • 全局作用域

直接编写在script标签中的js代码,都在全局作用域中
在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
在全局作用域中我们创建的对象都会作为window对象的属性储存,当然函数也会作为方法储存

  • 函数作用域

调用函数时创建一个函数作用域,调用完成函数作用域就会销毁
在函数作用域中操作变量,会先找自身作用域中的变量,若没有就会向上一级寻找(就近原则),直到全局作用域,如果都没有则会报错ReferenceError,在函数中要访问全局就加上window对象
另外,在函数作用域中也有 变量提前声明 函数提前声明 的特性,而且在函数中不使用var声明的变量会 作为全局变量

练习

说出下列代码的输出结果吧


var a=123;
function fun(){
 alert(a);
}
fun();//123
/*******************************************/
var a=123
function fun(){
 alert(a);
var a=456;
}
fun();//undefined
alert(a);//123
/*******************************************/
var a=123
function fun(){
 alert(a);
 a=456;
}
fun();//123
alert(a);//456
/*******************************************/
var a=123
function fun(a){
 alert(a);
 a=456;
}
fun();//undefined
alert(a);//123
/*******************************************/
var a=123
function fun(a){
 alert(a);
 a=456;
}
fun(123);//123
alert(a);//123

你细品上面的~~
总结

  1. 变量声明会提前到函数的顶部
  2. 只是声明被提前,初始化不提前,初始化还在原来初始化的位置进行初始化,这也是函数表达式为什么不能声明提前的原因
  3. 在声明之前变量的值是undefined。
  4. 函数声明提前的时候,函数声明和函数体均提前了。
Last modification:April 5, 2020
如果觉得我的文章对你有用,请随意赞赏