1. 全局作用域
- 直接编写在script标签中的JS代码,都在全局作用域。
- 全局作用域在页面打开时创建,在页面关闭时销毁。
- 在全局作用域中,有一个全局对象window。
- 它代表一个浏览器的窗口,由浏览器创建,课直接使用
- 在全局作用域中,
- 创建的变量都会作为window对象的属性保存
- 创建的函数都会作为window对象的方法保存
var a = 10; console.log(window.a); function fun() { console.log("test"); } // 以下两句完全一样 fun(); window.fun();
- 若变量前没有加
var
,则会作为window的属性来保存// 以下两句完全一样 a = 123; window.a = 123;
- 变量声明提前:使用
var
关键字声明的变量,会在所有的代码之子那个之前被声明,但不会赋值
相当于这样写:console.log(a); // undefined,因为此处还未给变量a赋值 var a = 123;
但若不写var a; console.log(a); // undefined,因为此处还未给变量a赋值 a = 123;
var
关键字,则不会被提前声明,这样写会报错:console.log(a); a = 123;
- 函数声明提前:
- 使用函数声明形式创建的函数function 函数名(){},会在所有的代码执行之前就被创建,所以可以在函数声明前来调用函数。
- 使用函数表达式创建函数,不会被声明提前,所以不能在声明前调用
fun(); // 正常运行 fun2(); // 报错 function fun(){ console.log("我是fun函数"); } var fun2 = function(){ console.log("我是fun2函数"); }
- 全局作用域中的变量都是全局变量,可以在页面的任意部分访问到。
2. 函数作用域
- 调用函数时创建的作用域,函数执行完毕以后,函数作用域销毁
- 每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
- 在函数作用域中可以访问到全局作用域的变量
- 在全局作用域中无法访问到函数作用域的变量
- 当在函数作用域操作变量时,会现在自身作用域中寻找,若有,则用;若无,则向上一级作用域中寻找。若全局作用域中仍未找到,则报错ReferenceError
- 逃开就近原则直接访问全局变量,可以使用window对象:
window.变量名
- 在函数作用域中也有声明提前的特性,使用
var
关键字声明的变量,会在函数中所有代码执行之前被声明。 - 在函数中不加
var
关键字,则会被设置为全局变量(window的属性)
function fun() {
}