指的是 变量 和 函数的生效范围
在 Ecmascript5及其之前的作用域是 函数作用域,不是块级作用域
根据作用域把变量和函数分为两种
1. 全局变量和全局函数
全局变量和全局函数的 生命周期,和当前页面一样长
2. 局部变量和局部函数
包含局部变量的函数,只要在运行以后,该局部变量就会被js的 垃圾回收机制回收
变量的声明(var) 和 函数的定义 都会被前置,他们会被前置到当前作用域的最前面
注意:var 的声明会被前置,let 的不会
//console.log(n); //报错,let 声明的变量无法前置
let n = 10;
btn.onclick = function(){
//let n = 10; //n是局部变量
n++;
num.innerHTML = n;
}
show();
js 允许同名函数,但是在调用的时候,后面的函数 会覆盖前面的函数
show(); //出卖我的爱
function show(){
console.log('我爱你你却爱着他');
}
show(); //出卖我的爱
function show(){
console.log('出卖我的爱');
}
show(); //出卖我的爱
js中的原则,在js中外部不能访问函数的局部变量,然而在一个函数中,可以访问外部的全局变量
可以简单理解为 外面的看不到里面,里面看得到外面
当函数的内部定义变量的时候,如果没有声明关键字,则此时的变量就相当于是一个全局变量( 前提是没有局部变量和当前变量重名 )
如果添加声明变量的关键字,则他就是一个局部变量
let str = '我应该在车底,不应该在车里';
function du(){
var str1 = '爱情不是你想卖';
console.log(str);
str2 = '你为何想着别人'; //全局变量
}
du(); //我应该在车底,不应该在车里
//全局不能访问局部变量
//console.log(str1); //报错
console.log(str2); //你为何想着别人
//全局变量和全局函数 实质上都是声明在 window对象上的属性和方法
console.log(window.str2); //你为何想着别人
函数内部变量的 就近原则:在函数内部会优先选择这个作用域内部的变量,如果当前作用域中没有该变量,就会去他上一级作用域去寻找。以此类推,直到全局作用域中,如果作用域没有该变量,则抛出错误
function run(){
let str = '你身上有她的香水味';
function see(){
let str = '后来,我总算学会了如何去爱';
console.log(str);
}
see();
}
run(); //后来,我总算学会了如何去爱
如果有多个script标签,则会按照浏览器的解析方式,下面的script中可以使用 上面的script 的全局变量和全局函数,然而在 上面的script不能使用 下面的变量和方法