变量声明

在JS中,使用一个变量之前应当先声明,用var来声明一个 变量;

变量声明方法:

var i; //只声明,未赋值的变量
var j=10; //声明且赋值的变量

通过一个var关键字声明多个变量

var a,sum,b; //同时声明3个变量

多个声明且同时为变量赋值的:

var a=1, b=2, c=3; //同时声明3个变量,并赋值

这里我们要注意,如果一个变量只声明但是未赋值的情况下,它的初始值是undefined. 而如果你尝试读取一个没有声明的变量的值,JS会报错 …is not defined;

变量的作用域(scope)

作用域指一个变量的作用范围。在js中有两种作用域:全局作用域和函数作用域。

全局作用域

  • 直接编写在script标签中的js代码,都在全局作用域;
  • 全局作用域在页面打开时创建,在页面关闭时销毁;
  • 在全局作用域中有个全局对象window,我们可以直接使用;window代表浏览器的窗口,它由浏览器创建;
  • 在我们全局作用域中,我们创建的变量都会作为window对象的属性保存;我们创建的函数都会作为window对象的方法保存;
  • 全局作用域中的变量都是全局变量,在页面的任意部分都可以用访问到;
var a = 10; //创建全局变量a
//定义一个全局函数
function fun(){ 
  console.log("我是fun函数");
}
console.log(window.a); //返回10,因为全局变量a就是window的一个属性
console.log(window.c); //返回undefined,因为没有c这个属性
fun(); //返回"我是fun函数" 
window.fun(); // 返回"我是fun函数",用window可以调用全局函数,因为函数是window对象的方法;

变量的声明提前
使用var关键字声明的变量,会在所有的代码执行之前被声明好(但是不会赋值)。但是如果声明变量时不使用var关键字,则变量不会被声明提前

//使用var关键字
console.log(a); //返回undefined但是不报错,因为a被先声明但是没有被赋值
var a = 123; 

//不使用var关键字命名
console.log(a); //报错 返回 a is not defined. 这是因为a没有被定义
a = 123;

函数的声明提前

  • 使用函数声明形式创建的函数 function 函数(){}, 它会在我们所有代码执行之前就被创建。所以我们可以在函数声明前来调用函数;
  • 使用函数表达式创建的函数,不会被声明提前,所以不能在声明前被调用;
fun(); // 返回“我是fun函数”,因为使用函数声明形式创建的函数他会在所有代码执行前,就创建好。而此时已创建好,可以被调用。
function fun(){
 console.log("我是fun函数");
}


fun2(); // 报错,is not defined 因为fun2是使用函数表达式创建的函数,不会被声明提前。所以在此时调用,它还没被创建。
var fun2 = function(){
 console.log("我是fun2函数");
}

函数作用域

  • 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁。
  • 每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的。
  • 在我们函数作用域中,可以访问到全局作用域的变量。
  • 在全局作用域中无法访问到函数作用域的变量。
  • 当在函数作用域中操作一个 变量时,它会现在自身的作用域中寻找,如果有就直接使用,如果没有将向上一级作用域中寻找直到找到全局作用域,如果全局作用域中以让没有找到就会报错。
  • 在函数中如果要访问全局变量,可以是用window对象。
var a = 10; //全局变量
function fun(){ //全局函数
 var a = "fun a"; //函数内部局部变量
 var b= 20  //函数内部局部变量
 console.log(a); //返回局部变量a,因为此刻函数中有a变量
}
fun();
 console.log(b); //在全局中调用变量b,而此刻全局中没有,所以报错;

看几个例子:

var a = 123;
function fun(){
 console.log(a);
}
fun(); // 返回的是 123, 因为没有局部,这时向上找,就是全局a
var a =123;
function fun(){
  console.log(a);
  var a = 456;
}
fun(); //返回 undefined,因为函数中声明a变量,变量提前但是没有赋值,所以返回undefined
alert(a); //返回123;此时调用的是全局变量
var a =123;
function fun(){
  console.log(a);
  a = 456;
}
fun(); //返回123,因为函数中声明a变量,这时向上找到全局变量a
alert(a); // 返回456,此时a被重新赋值
var a =123 ;
function fun(a){
 alert(a);
 a=456;
}
fun(); //返回 undefined,定义了函数变量a,但是没有传形参赋值。
alert(a);  // 返回123,此时函数作用域的a是给局部函数赋值,不影响全局。