3. Javascript学习笔记——变量、内存、作用域

前端开发 作者: 2024-08-26 01:20:01
3. 变量、内存、作用域 3.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值【Undefined、Null、Boolean、Number 和 Strin

3. 变量、内存、作用域

  •  1 /// 下面这段代码中,changeColor()的作用域链中包含两个对象:他自己变量对象(其中定义着arguments对象) 和全局环境的变量对象。在函数内部可以访问变量color就是因为可以再这个作用域链中找到它。
     2   var color = "blue"; 
     3   function changeColor(){ 
     4       if (color === "blue"){ 
     5           color = "red" 6       } else { 
     7           color = "blue" 8       } 
     9   } 
    10   changeColor(); 
    11   alert("Color is now " + color);  red
    12 13 14 15 16   /以下代码共涉及 3 个执行环境:全局环境、changeColor()的局部环境和 swapColors()的局部环境。
    17    2. 全局环境中有一个变量 color 和一个函数 changeColor()。
    18    1. changeColor()的局部环境中有一个名为 anotherColor 的变量和一个名为 swapColors()的函数,但它也可以访问全局环境中的变量 color。
    19    0. swapColors()的局部环境中有一个变量 tempColor,该变量只能在这个环境中访问到。无论全局环境还是 changeColor()的局部环境都无权访问 tempColor。然而,在 swapColors()内部则可以访问其他两个环境中的所有变量,因为那两个环境是它的父执行环境。
    20   21   22       var anotherColor = "red"23        swapColors(){ 
    24           var tempColor = anotherColor; 
    25           anotherColor = color; 
    26           color = tempColor; 
    27            这里可以访问 color、anotherColor 和 tempColor 
    28 29     这里可以访问 color 和 anotherColor,但不能访问 tempColor 
    30       swapColors(); 
    31 32    这里只能访问 color 
    33   changeColor(); 
    • 虽然执行环境的类型总共只有两种——全局和局部(函数),但还是有其他办法来延长作用域链。就是当执行流进入下列任何一个语句时,作用域链就会得到加长:
       try-catch 语句的 catch 块;
       with 语句。
       4   这两个语句都会在作用域链的前端添加一个变量对象。对 with 语句来说,会将指定的对象添加到作用域链中。
          对 catch 语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。下面看一个例子。
      5 buildUrl() { 6 var qs = "?debug=true" 7 with(location){ 8 var url = href + qs; 10 return url; 11 13 with 语句接收的是 location 对象,因此其变量对象中就包含了 location 对象的所有属性和方法,而这个变量对象被添加到了作用域链的前端。
        //buildUrl()函数中定义了一个变量 qs。当在with 语句中引用变量 href 时(实际引用的是 location.href),可以在当前执行环境的变量对象中找到。
        当引用变量 qs 时,引用的则是在 buildUrl()中定义的那个变量,而该变量位于函数环境的变量对象中。至于 with 语句内部,则定义了一个名为 url 的变量,
        因而 url 就成了函数执行环境的一部分,所以可以作为函数的值被返回。
  •  在if语句中定义了变量color,如果在C/C++、Java中,color会在if语句执行完毕后被销毁。但在JavaScript中,if语句中的变量声明会将变量加到当前执行环境中(这里是全局环境)。
    if (true) {
     3       ;
     4   }
     5   alert(color);  "blue"
     6  7  8    对于有块级作用域的语言来说,for 语句初始化变量的表达式所定义的变量,只会存在于循环的环境之中。而对于 JavaScript 来说,由 for 语句创建的变量 i 即使在 for 循环执行结束后,也依旧会存在于循环外部的执行环境中。
     9   for(var i = 0; i < 10; i++){
          doSomething();
    12   alert(i);  10
    15    【变量声明】
     如果使用 var 声明变量,则会被自动添加到最近的环境中。在函数内部,最接近的环境就是函数的局部环境。如果初始化变量时,没有使用var声明,则该变量会被自添加到全局环境中。
    17 18  【查询标识符】
    当在某个环境中引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到了该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。搜索过程将一直追溯到全局环境的变量对象。如果在全局环境中也没有找到这个标识符,则意味着该变量尚未声明
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_68702.html