作用域指一个变量的作用范围。
JS的作用域
在JS中,有两种作用域
-
全局作用域
直接编写在script标签中 JS代码 都在全局作用域
在页面打开时创建,在页面关闭时销毁。
在全局作用域中,有一个全局对象window
,我们可以直接使用;它代表的是浏览器的窗口,由浏览器创建!
在全局作用域中,我们创建的变量都会作为window对象的属性保存;创建的函数都会作为window对象的方法保存!(前面已经证实了)
全局作用中声明的变量叫全局变量
,在页面得任意范围都可以访问! -
函数作用域
调用函数时创建函数作用域,函数执行完毕后销毁函数作用域!
每调用一次函数就会创建一个新的函数作用域,彼此之间是相互独立的!
在函数作用域中可以访问到全局变量,但是在某个函数作用域里面声明的变量只能在该函数作用域中访问!
当在作用域中操作一个变量的时候,会先在自己的作用域中查找,如果没有,则向上一级作用域查找
声明变量
- 我们声明一个变量要用到
var关键字
,还有其他方式吗?—— 有 - 通过
window对象
window.a = 123;
console.log("a", a);
成功声明
我们前面学到了在script标签中,调用window对象中的属性和方法是不需要写 window. 的
所以,可以写成如下形式而不会报错!
a = 123;
console.log("a", a);
两种声明方式的区别:推荐用var声明,因为它能提前声明
var 的声明提前
我们JS的代码是从前往后运行的。看下面这个例子
console.log("a", a);
a = 123;
console.log("a", a);
var a = 123;
image.png
不报错的原因
不报错的原因就是 var 关键字的 声明提前。
它的解析顺序是如下
var a
console.log("a", a);
a = 123;
函数的声明提前
使用函数声明形式创建的函数,它的声明也会别提前。
fn2();
fn1();
var fn1 = function (){
//使用函数表达式声明函数
console.log("fn1");
}
function fn2 () {
//使用函数声明方式声明函数
console.log("fn2");
}
image.png
真实执行顺序如下:
function fn2 () {
//使用函数声明方式声明函数
console.log("fn2");
}
var fn1
fn2();
fn1();
fn1 = function (){
//使用函数表达式声明函数
console.log("fn1");
}
网友评论