1. 如何区分全局作用域和私有作用域?
- 在全局作用域下声明(预解释的时候)的变量是全局变量
- 在私有作用域中声明的变量和
函数的形参
都是私有变量:
在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定他是否为私有变量,如果是私有的变量,那么和外面的没有任何关系;如果不是私有的,则往当前作用域的上级作用域进行查找,如果上级作用域也没有则继续查找,一直找到window为止...(作用域链);
2. 当函数执行的时候(直接目的: 让函数体中的代码执行),首先会形成一个私有作用域,然后按照如下步骤执行:
- 如果有形参,先给形参赋值
- 进行私有作用域中的预解释
- 私有作用域中的代码从上到下执行
- ...
函数形成了一个私有作用域保护了里面的私有变量不受外界干扰(外面修改不了私有的,私有的也修改不了外面的) -> 闭包
console.log(total);
var total = 0;
function fn(num1,num2){
console.log(total);
var total = num1 + num2;
console.log(total);
}
fn(100,200)
console.log(total)
// 输出的结果依次是:
// undefined
// undefined
// 300
// 0
console.log(total);
var total = 0;
function fn(num1,num2){
console.log(total);
total = num1 + num2;
console.log(total);
}
fn(100,200)
console.log(total)
// 输出的结果依次是:
// undefined
// 0
// 300
// 300
在全局作用域中,带var和不带var的关系?
区别: 带var的可以预解释,所以在赋值的前面可以执行不会报错; 不带var的是不能进行预解释的,在前面执行会报错
关系: num1 = 1 -> 相当于给window增加了一个叫num1 的属性名,属性值为 1
var num = 1 -> 首先它相当于给全局作用域增加了一个全局变量num;但是不仅如此,他也相当于给window增加一个属性名为num,属性值为1
console.log(num) // undefined
var num = 1;
console.log(num) // 1
console.log(num1) // Uncaught ReferenceError: num1 is not defined(报错:num1未定义)
num1 = 1;
console.log(num1) // 1
私有作用域中出现的一个变量不是私有的,则往上一级作用域进行查找,上级没有则继续向上查找,一直找到window位置,如果找不到呢?
- 我们是要获取值:console.log(total) -> 报错了!
function fn(){
console.log(total); // Uncaught ReferenceError: total is not defined(报错:total未定义)
total = 100;
}
fn()
console.log(total) // 报错后,后面的代码不执行
- 我们要是设置值:total = 100;相当于给window增加一个属性名total,属性值100
function fn(){
total = 100;
}
fn()
console.log(total) // 100
js中如果在不进行任何特殊处理的情况下,上面的代码报错,下面的代码都不在执行了
网友评论