执行环境:定义了变量和函数有权访问的其他数据,决定了他们各自的行为;每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中;
全局执行环境是最外层的一个执行环境。全局执行环境被认为是window对象,因此所有全局的变量和函数都是作为window对象的属性和方法创建的;某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数也会被销毁;
每个函数都有自己的执行环境。内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境的任何变量和函数;
// 全局作用域:供所有代码执行的环境,只要浏览器不关闭他就不会消失;
// 私有作用域:函数执行的时候,开辟的用来解析函数体中代码的全新栈内存,他也叫私有作用域
// 私有作用域可以访问全局作用域,全局作用域不可访问私有作用域;
// 体现在,在私有作用域中可以访问和调用全局作用域的变量,但是全局作用域不可以访问和调用私有作用域的变量
// var num = 1;
// var obj = {name: 'zx', age: 26};
// function sum() {
// var n = num;
// console.log(n);
// function fn() {
// console.log('函数')
// }
// fn();
// }
// sum();// 函数体里边的代码开始解析
// sum函数被调用,这时候会开辟一个全新私有作用域(全新栈内存),供我们函数体中的代码字符解析执行;
// 意义:理解全局作用域和私有作用域,同时也就理解全局变量和私有变量; 私有和全局之间的关系。所以全局变量也叫公共变量,公有变量。
// 私有作用域可以访问全局作用域,全局作用域不可访问私有作用域;
// 体现在,在私有作用域中可以访问和调用全局作用域的变量,但是全局作用域不可以访问和调用私有作用域的变量
// var num = 1;
// var obj = {name: 'zx', age: 26};
// function sum() {
// var n = num;
// console.log(n);
// function fn() {
// console.log('函数')
// }
// fn();
// }
// sum();// 函数体里边的代码开始解析
// sum函数被调用,这时候会开辟一个全新私有作用域(全新栈内存),供我们函数体中的代码字符解析执行;
// 意义:理解全局作用域和私有作用域,同时也就理解全局变量和私有变量; 私有和全局之间的关系。所以全局变量也叫公共变量,公有变量。
2.没有块级作用域:
if(true){
var color = "blue";
var color = "blue";
}
console.log(color) //返回值为blue;在其他语言中,color会在if执行完毕后销毁,但在js中在if语句中的变量声明会将变量添加到当前的执行环境中;在外部也可以访问到;
a)声明变量
使用var声明的变量会直接添加到最接近的环境中。如果初始化变量没有使用var,该变量会自动添加到全局环境中;
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
console.log(add(10, 3));//返回13;
console.log(sum) // 会报错,sum属于add的局部变量,外部访问不了;
function add(num1,num2){
sum = num1 + num2;
return sum;
}
console.log(add(10, 3));//返回13;
console.log(sum) // 返回13; 由于sum声明的时候没有var所以属于全局变量,固在外部也可以访问到;
var sum = num1 + num2;
return sum;
}
console.log(add(10, 3));//返回13;
console.log(sum) // 会报错,sum属于add的局部变量,外部访问不了;
function add(num1,num2){
sum = num1 + num2;
return sum;
}
console.log(add(10, 3));//返回13;
console.log(sum) // 返回13; 由于sum声明的时候没有var所以属于全局变量,固在外部也可以访问到;
b)查询标识符;
搜索过程是从作用域链的前端开始,向上逐级查询,直到找到名字匹配的标识符;如果在局部环境中找到该标识符,则停止搜索;如果在局部环境中没有找到,则继续延作用域链向上搜索,一直追溯到全局环境变的变量对象;如果在全局环境中没有找到标识符,意味着该变量尚未声明;
var color = "red";
function getColor(){
return color;
}
console.log(getColor());//返回red;先在getColor()函数中搜索,没有就向上搜索,全局环境中搜索找到color;
var color = "red";
function getColor(){
var color = "blue"
return color;
}
console.log(getColor());//返回blue;先在getColor()函数中搜索,找到color就不会在向上搜索;
function getColor(){
return color;
}
console.log(getColor());//返回red;先在getColor()函数中搜索,没有就向上搜索,全局环境中搜索找到color;
var color = "red";
function getColor(){
var color = "blue"
return color;
}
console.log(getColor());//返回blue;先在getColor()函数中搜索,找到color就不会在向上搜索;