目录
2.1全局作用域
2.2函数作用域
2.3 块作用域
1.var关键字
2.let关键字
3.const关键字
4.重新声明
作用域:指一个变量的作用范围,在js中共有三种作用域,全局作用域 函数作用域 块作用域。
- 直接编写在Script标签中的JS代码,都在全局作用域
- 全局作用域在页面打开时创建,页面关闭时销毁
- 在全局作用域中有一个全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接使用
- 在全局作用域中:
创建的变量都会作为window对象的属性保存
创建的函数都会作为window对象的方法保存
- 全局作用域中的变量都是全局变量,在页面的任意部分都可以访问
------------------------------------附-全局作用域中变量声明和函数声明--------------------------------------------
1.变量声明提前
使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会被赋值),
若未使用var关键字声明变量,则变量不会被提前声明
console.log("a="+a); //可显示,未被赋值
console.log("b="+b); //不显示,报错
var a=10;
b =20;
2.函数声明提前
使用函数声明形式创建的函数,function 函数名( ){ },会在所有代码执行之前就被创建,可以在创建前就调用函数
使用函数表达式创建的函数,var xx= function( ){ },不会被声明提前,不能在创建前调用函数
hi();
hello();
function hi() { //函数声明
console.log("你好!");
}
hello = function () { //函数表达式
console.log("你好呀");
}
- 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
- 每调用一次函数都会创建一个新的函数作用域,他们之间是相互独立的
- 在函数作用域中可以访问到全局作用域的变量
- 在全局作用域中访问不到函数作用域中的变量
var a=10; //全局作用域变量
function fun(){
var b=20; //函数作用域变量
console.log("a="+a);
}
fun();
console.log("b="+b);
- 当在函数作用域操作一个变量时,它会现在自身作用域中寻找,如果有就直接使用,如果没有,则向上一级作用域中寻找,如果全局作用域中依然没有找到,则会报错ReferenceError
- 在函数中要访问全局变量可以使用window对象
var a = 10; //全局变量
function fun() {
var a = 20; //fun2()函数的上一级作用域,获取到a的值
function fun2() {
console.log(a); //访问上一级作用域
console.log(window.a); //访问全局变量
}
fun2();
}
fun();
console.log("b=" + b);
-------------------------------------附------函数作用域中的函数声明-------------------------------------------------
使用var关键字声明的变量,会在函数中所有的代码执行之前被声明,
不使用var声明的变量,都会成为全局变量
var c = 33;
function fun5() {
console.log("c=" + c); //向上一级寻找c变量
c = 10;
}
fun5();
console.log("c=" + c); //在全局中输出c
var e = 23;
function fun6(e) { //定义形参e 相当于在函数作用域中声明了变量
alert(e);
}
fun6();
//fun6(10); 传入实参,此时输出10
var
关键词声明的变量没有块作用域,在块 { } 内声明的变量可以从块之外进行访问。var
关键字重新声明变量会带来问题。在块中重新声明变量也将重新声明块外的变量//(1)
{
var x = 10;
}
// 此处可以使用 x
//(2)
var x = 10; // 此处 x 为 10
{
var x = 6; // 此处 x 为 6
}
// 此处 x 为 6
在 ES2015 之前,JavaScript 是没有块作用域的,可以使用 let
关键词声明拥有块作用域的变量,在块 {} 内声明的变量无法从块外访问
使用 let
关键字重新声明变量可以解决这个问题,在块中重新声明变量不会重新声明块外的变量
//(1)
{
let x = 10;
}
// 此处不可以使用 x
//(2)
var x = 10; // 此处 x 为 10
{
let x = 6; // 此处 x 为 6
}
// 此处 x 为 10
const
变量必须在声明时赋值,不能重新赋值原始值,如果我们将一个原始值赋给常量,我们就不能改变原始值
const PI = 3.141592653589793;
PI = 3.14; // 会出错
PI = PI + 10; // 也会出错
可以更改常量对象的属性:但是无法重新为常量对象赋值
// 您可以创建 const 对象:
const car = {type:"porsche", model:"911", color:"Black"};
// 您可以更改属性:
car.color = "White";
// 您可以添加属性:
car.owner = "Bill";
const car = {type:"porsche", model:"911", color:"Black"};
car = {type:"Volvo", model:"XC60", color:"White"}; // ERROR
let
重新声明一个 var
变量/ let
变量,也不允许通过通过 var
重新声明一个 let
变量let
重新声明变量是允许的:var
或 let
变量重新声明或重新赋值给 const/
为已有的 const 变量重新声明声明或赋值是不允许的const
是允许的: