1. javaScript作用域 :
就是代码名字(变量) 在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突
2. js的作用域(es6)之前:全局作用域 局部作用域
3. 全局作用域: 整个script标签 或者是一个单独的js文件
var num = 10;
var num = 30;
console.log(num);//30
4. 局部作用域(函数作用域):
在函数内部就是局部作用域 这个代码的名字只在函数内部起作用和效果
function fn() {
//局部作用域
var num = 20;
console.log(num);
}
fn();//20
5.变量的作用域:
根据作用域的不同我们变量分为全部变量和局部变量
6.全局变量:
在全局作用域下的变量 在全局下都可以使用
7.注意 如果在函数内部 没有声明直接赋值的变量也属于全局变量
var num = 10;//num就是一个全局变量
console.log(num);
function fn(){
console.log(num);
}
fn();
8.局部变量 在局部作用域下的变量 后者在函数内部的变量就是 局部变量
9.注意 函数的形参也可以看作局部变量
function fun() {
var num1 = 10;//num1就是局部变量 只能在函数内部使用
num2 = 20;
}
fun();
// console.log(num1);
console.log(num2);
10. 从执行效率来看全局变量和局部变量
(1)全局变量只有浏览器关闭的时候才会销毁 ,比较占内存资源
(2)局部变量 当我们程序执行完毕就会销毁 , 比较节约内存资源
11. js中没有块级作用域
(1).js的作用域: 全局作用域 局部作用域 现阶段我们js 没有 块级作用域
(2).我们js 也是在 es6 的时候新增的块级作用域
(3).块级作用域{} if{} for{}
(4).作用域链 内部函数访问外部函数的变量 , 采取的是链式查找的方式来决定取哪个值 这种结构我们称为作用域链 就近原则
站在目标出发一层一层往外查找
var num = 10;
function fn( ) {//外部函数
var num = 20;
function fun( ) {//内部函数
console.log(num);//20
}
fun( );
}
fn( );
12. 预解析
(1). 我们js引擎运行js 分为两步: 预解析 代码执行
(2). 预解析 js 引擎会把 js 里面所有的var 还有 function 提升到当前作用域的最前面
(3). 代码执行 按照代码书写的顺序从上往下执行
2. 预解析分为 变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升 就是把所有变量声明提升到当前的作用域最前面 不提升赋值操作
(2)函数提升 就是把所有函数声明提升到当前的作用域最前面 不调用函数
3.变量提升
console.log(num);//undefind
var num = 10;
//相当于执行了以下代码
var num;
console.log(num);
fun();//报错
var fun = function() {
console.log(22);
}
4.变量提升
//相当于执行了以下代码
var fun;
fun();
fun = function(){
console.log(22);
}
5.函数提升
fn();
var = function fn(){
console.log(11)
};
//相当于执行了以下代码
var = function fn(){
console.log(11)
};
fn();
6.函数表达式 调用必须写在函数表达式的下面
fun();//报错
var fun = function() {
console.log(22);
}