首页 > 代码库 > 2017-5-26执行环境及租用域

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.管理内存

  1. /** 
  2. * Created by Administrator on 2017-5-26. 
  3. */ 
  4. /* 
  5. * ------------------------------ 执行环境及作用域 -------------------- 
  6. * 执行环境:定义了变量和函数有权访问的其他数据,决定了它们各自的行为,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中 
  7. *全局执行环境:是最外围的一个执行环境,全局执行环境直到应用程序退出时才会被销毁; 
  8. * 1.每个函数都有自己的执行环境 
  9. * 2.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用 
  10. * */ 
  11.  
  12. //1.每个函数都有自己的执行环境 
  13. var color = "blue";//全局变量 
  14. function changeColor()
  15. if(color === "blue"){ 
  16. color = "red"
  17. var size = 80
  18. }else
  19. color = "blue"

  20. console.log(size); 

  21. console.log(color); //blue 
  22. changeColor(); 
  23. console.log(color); //red,color的值在changeColor()函数中被改变 
  24. console.log(size);//访问不了size这个变量 
  25.  
  26. //2.在局部作用域中定义的变量可以在局部环境中与全局变量互换使用 
  27. var color = "blue"
  28. function changeColor ()
  29. var anotherColor = "red"
  30. function swapColors()
  31. var tempColor = anotherColor; 
  32. anotherColor = color; 
  33. color = tempColor; 
  34. //这里可以访问color,anotherColor,tempColor 
  35. console.log(color,anotherColor,tempColor); 

  36. swapColors() 
  37. //这里只能访问color anotherColor 
  38. console.log(color,anotherColor); 

  39. //这里只能访问color 
  40. console.log(color); 
  41. changeColor(); 
  42. console.log(color); 
  43. //swapColors(); //这个函数在外部访问不了 
  44. /* 
  45. * 4.2.1 延长作用域链 
  46. * 执行环境的类型总共只有两种:全局和局部(函数) 
  47. * 延长作用域链:有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行完后被移出 
  48. * 1.try-catch语句的cath块,会创建一个新的变量对象; 
  49. * 2.with语句,会将指定的对象添加到作用域链中; 
  50. * */ 
  51.  
  52. //2.with语句会将指定的对象添加到作用域链中 
  53. function buildUrl()
  54. var qs = "?debug=true"
  55. with(location){ 
  56. var url = href + qs; 

  57. return url; 

  58.  
  59. console.log(buildUrl()); 
  60.  
  61. /* 
  62. * 4.2.2 没有块级作用域 
  63. * 1.没有块级作用域 
  64. * 2.由for语句创建的变量即使是在循环结束之后也会依然存在于全局变量中 
  65. * a.声明变量 
  66. * 使用var声明的变量会自动被添加到最接近的环境中,在函数中最接近的环境就是函数的局部环境, 
  67. * 在with语句中最接近的环境就是函数环境 
  68. * 如果初始化没有使用var声明,该变量会自动添加到全局环境 
  69. * b.查询标示符 
  70. * 当在某个环境中为了读取或者写入一个标示符是,必须通过搜索来确定该标示符实际代表什么, 
  71. * 搜素过程从作用域前端开始向上逐级查询与给定名字匹配的标示符 
  72. * 
  73. * */ 
  74.  
  75. //1.没有块级作用域if示例 
  76. if(true){ 
  77. var color = "blue"
  78. } //按照C语言的理解这里是一个块级,但是在javaScript中并不会 
  79. //在if语句中将color添加到了全局作用域中 
  80. function tempColor()
  81. if(color === "blue"){ 
  82. console.log("三碗不过景阳冈");//依然可以取到color的变量 


  83. tempColor(); //三碗不过景阳冈; 
  84.  
  85. //2.由for语句创建的变量即使是在循环结束之后也会依然存在于全局变量中 
  86. for(var i = 0; i< 10; i++){ 
  87. console.log(i); 

  88. console.log(i+"武松"); 
  89.  
  90. //4.2.2 a.声明变量 
  91. num1 = 18;//未声明的全局变量 
  92. function add(num2)
  93. var sum = num1 + num2; 
  94. return sum; 

  95. //add(99); 
  96. console.log(sum);//warning:sum变量是一个全局变量 
  97. console.log(add(99)); 
  98. //使用未声明的全局变量 
  99. function add(num1,num2)
  100. sum = num1 + num2; //未声明的sum变量 
  101. return sum; 

  102. add(99,1); 
  103. console.log(sum); 
  104. //4.4.4 b查询标示符 
  105. var color = "blue"
  106. function getColor()
  107. console.log(color); 

  108. /* 
  109. *调用getColor的过程 
  110. * window 
  111. * | 
  112. * |-------color 
  113. * | 
  114. * |--------------------getColor 
  115. * */ 
  116. getColor(); 
  117. //如果存在一个局部环境中存在着同名标示符,就不会使用位于父环境中的标示符 
  118. var color = "blue"
  119. function getColor()
  120. var color = "red"
  121. console.log(color);//red 

  122. //修改后的函数中声明了一个局部color变量,其值为"red",搜索即停止 
  123. getColor(); 
  124. console.log(color); //blue 
  125. /* 
  126. * -------------------------------------4.3 垃圾收集------------------- 
  127. * JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存 
  128. * 1.标记清除 
  129. * 2.引用计数 
  130. * 3.性能问题 
  131. * 4.管理内存 
  132. * */ 

2017-5-26执行环境及租用域