2017-5-26执行环境及租用域
执行环境及作用域
-
执行环境及作用域
执行环境:定义了变量和函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中
*全局执行环境:是最外围的一个执行环境,全局执行环境直到应用程序退出时才会被销毁;1.每个函数都有自己的执行环境
2.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用
-
4.2.1 延长作用域链
执行环境的类型总共只有两种:全局和局部(函数)
延长作用域链:有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行完后被移出
1.try-catch语句的cath块,会创建一个新的变量对象;
2.with语句,会将指定的对象添加到作用域链中;
-
4.2.2 没有块级作用域
1.没有块级作用域
2.由for语句创建的变量即使是在循环结束之后也会依然存在于全局变量中
a.声明变量
使用var声明的变量会自动被添加到最接近的环境中,在函数中最接近的环境就是函数的局部环境,
在with语句中最接近的环境就是函数环境
如果初始化没有使用var声明,该变量会自动添加到全局环境
b.查询标示符
当在某个环境中为了读取或者写入一个标示符是,必须通过搜索来确定该标示符实际代表什么,
搜素过程从作用域前端开始向上逐级查询与给定名字匹配的标示符
-
JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存
1.标记清除
2.引用计数
-
3.性能问题
-
4.管理内存
- /**
- * Created by Administrator on 2017-5-26.
- */
- /*
- * ------------------------------ 执行环境及作用域 --------------------
- * 执行环境:定义了变量和函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中
- *全局执行环境:是最外围的一个执行环境,全局执行环境直到应用程序退出时才会被销毁;
- * 1.每个函数都有自己的执行环境
- * 2.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用
- * */
-
- //1.每个函数都有自己的执行环境
- var color = "blue";//全局变量
- function changeColor() {
- if(color === "blue"){
- color = "red";
- var size = 80;
- }else{
- color = "blue";
- }
- console.log(size);
- }
- console.log(color); //blue
- changeColor();
- console.log(color); //red,color的值在changeColor()函数中被改变
- console.log(size);//访问不了size这个变量
-
- //2.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用
- var color = "blue";
- function changeColor (){
- var anotherColor = "red";
- function swapColors(){
- var tempColor = anotherColor;
- anotherColor = color;
- color = tempColor;
- //这里可以访问color,anotherColor,tempColor
- console.log(color,anotherColor,tempColor);
- }
- swapColors()
- //这里只能访问color anotherColor
- console.log(color,anotherColor);
- }
- //这里只能访问color
- console.log(color);
- changeColor();
- console.log(color);
- //swapColors(); //这个函数在外部访问不了
- /*
- * 4.2.1 延长作用域链
- * 执行环境的类型总共只有两种:全局和局部(函数)
- * 延长作用域链:有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行完后被移出
- * 1.try-catch语句的cath块,会创建一个新的变量对象;
- * 2.with语句,会将指定的对象添加到作用域链中;
- * */
-
- //2.with语句会将指定的对象添加到作用域链中
- function buildUrl(){
- var qs = "?debug=true";
- with(location){
- var url = href + qs;
- }
- return url;
- }
-
- console.log(buildUrl());
-
- /*
- * 4.2.2 没有块级作用域
- * 1.没有块级作用域
- * 2.由for语句创建的变量即使是在循环结束之后也会依然存在于全局变量中
- * a.声明变量
- * 使用var声明的变量会自动被添加到最接近的环境中,在函数中最接近的环境就是函数的局部环境,
- * 在with语句中最接近的环境就是函数环境
- * 如果初始化没有使用var声明,该变量会自动添加到全局环境
- * b.查询标示符
- * 当在某个环境中为了读取或者写入一个标示符是,必须通过搜索来确定该标示符实际代表什么,
- * 搜素过程从作用域前端开始向上逐级查询与给定名字匹配的标示符
- *
- * */
-
- //1.没有块级作用域if示例
- if(true){
- var color = "blue";
- } //按照C语言的理解这里是一个块级,但是在javaScript中并不会
- //在if语句中将color添加到了全局作用域中
- function tempColor(){
- if(color === "blue"){
- console.log("三碗不过景阳冈");//依然可以取到color的变量
- }
- }
- tempColor(); //三碗不过景阳冈;
-
- //2.由for语句创建的变量即使是在循环结束之后也会依然存在于全局变量中
- for(var i = 0; i< 10; i++){
- console.log(i);
- }
- console.log(i+"武松");
-
- //4.2.2 a.声明变量
- num1 = 18;//未声明的全局变量
- function add(num2){
- var sum = num1 + num2;
- return sum;
- }
- //add(99);
- console.log(sum);//warning:sum变量是一个全局变量
- console.log(add(99));
- //使用未声明的全局变量
- function add(num1,num2){
- sum = num1 + num2; //未声明的sum变量
- return sum;
- }
- add(99,1);
- console.log(sum);
- //4.4.4 b查询标示符
- var color = "blue";
- function getColor(){
- console.log(color);
- }
- /*
- *调用getColor的过程
- * window
- * |
- * |-------color
- * |
- * |--------------------getColor
- * */
- getColor();
- //如果存在一个局部环境中存在着同名标示符,就不会使用位于父环境中的标示符
- var color = "blue";
- function getColor(){
- var color = "red";
- console.log(color);//red
- }
- //修改后的函数中声明了一个局部color变量,其值为"red",搜索即停止
- getColor();
- console.log(color); //blue
- /*
- * -------------------------------------4.3 垃圾收集-------------------
- * JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存
- * 1.标记清除
- * 2.引用计数
- * 3.性能问题
- * 4.管理内存
- * */
每天叫醒的不是闹钟,而是梦想