作用域
-
作用域就是代码能起作用(能影响)的区域
- 全局作用域 和 私有作用域
-
作用域就是一块栈内存
-
堆内存是用来存储引用数据类型的
-
栈内存是用来存储值类型的,还有就是用来提供代码运行环境
-
全局作用域
- 页面一打开就会形成一个全局作用域,一个页面只有一个全局作用域
-
私有作用域
- 在函数执行的时候会形成一个私有的作用域
-
块级作用域
- 指的是 判断句 循环句 的大括号包起来的部分
- 是es6新增的,只有let 和 const 声明的变量能识别块级作用域,对于var来说,不存在块级作用域这一说
-
全局作用域中声明的变量,我们称为全局变量
-
私有作用域中声明的变量,我们称为私有变量
- 形参也是私有变量
-
上级作用域
- 函数执行时形成的那个私有作用域,一般都会存在一个上级作用域,私有作用域的上级作用域是谁,跟这个函数在哪里执行没有关系,只跟函数在那个作用域定义的有关
-
作用域链
- 私有作用域中的变量,有可能不是该私有作用域的私有变量,这时,该变量对应的值就需要去上级作用域查找,若仍不是上级作用域的私有变量,则接着向上级查找,知道找到 window(全局)位置,若仍没有,则报错。
-
函数执行时,现有形参赋值,再有变量提升
-
var a = b = 20; ==> var a = 10; b = 20; 这个b没有变量提升
-
var a = 10,b=20; ==> var a = 10; var b = 10;
练习
function f2(){
let b = 100;
function f(){
console.log(b);
var a = 100;
}
f()
}
f2(
var a = 1;
function fn() {
console.log(a);
var a = 5;
console.log(a);
a++;
var a;
fn3();
fn2();
console.log(a);
function fn2() {
console.log(a);
a = 20;
}
}
function fn3() {
console.log(a);
a = 200;
};
fn();
console.log(a);
console.log(num,str);
var num = 18;
var str = 'lily'
function fn2(){
console.log(str,num);
num = 19;
str = 'candy';
var num = 14;
console.log(str,num);
}
fn2()
console.log(str,num);
- 块级作用域:指的是 判断句 循环句 的大括号抱起来的部分 es6新增 只有let 和 const 声明的变量能识别块级作用域,对于var来说,不存在块级作用域这一说
var foo =1
function bar(){
if(foo){
var foo =10
}
console.log(foo); //undefined
}
bar()