zoukankan      html  css  js  c++  java
  • js作用域

    一、js没有块级作用域

    在c,java等语言中花括号里的代码都有自己的作用域,而js花括号没有块级作用域,经常会导致一些困惑,不明所以。例如:

    console.info(color);

    if(true){

      var color = "blue";

    }

    console.info(color);   

    输出结果:undefined    blue

    这里开始没有定义color变量,一般来说应该报错,可是没有,是因为if语句里定义了color变量,因为没有块级作用域,第二次输出的是blue。

    上面的代码等同于下面代码:

    var color;

    console.info(color);

    if(true){

      color = "blue";

    }

    console.info(color);   

    在使用for循环的时候要注意这一点:

    for(var i=0;i<10;i++){

        doSomething(i);

    }

    console.info(i);

    对于js没有块级作用域,所以会输出10。

    二、声明变量

    function add(num1,num2){

      var sum = num1 + num2;

      return sum; 

    }

    var result = add(10,20);

    console.info(result);

    console.info(sum);

    结果:30 Uncaught ReferenceError: sum is not defined(…)

    原因:sum变量是在函数add中声明的,所以sum只能在函数中使用,不能在函数外使用。在函数中使用var声明变量,其作用域只能是在函数中

    下面的代码只是将add函数中的var去掉

    function add(num1,num2){

      var sum = num1 + num2;

      return sum; 

    }

    var result = add(10,20);

    console.info(result);

    console.info(sum);

    结果:30  30

    原因:没有在函数内使用var关键字声明,于是在调用完add函数,将sum变量添加到全局变量中。所以即使函数执行完毕,全局也可以使用该变量。

    三、搜索变量

    变量的搜索是从作用链的前端开始,一级一级的搜索,如果在局部搜索到,则停止,否则一直追溯到全局环境的变量。

    color="blue";
    function t(){
      console.log(color);
      var color="red";
      function s(){
        var color="yellow";
        console.log(color);
      }
      function ss(){
        console.log(color);
      }
      s();
      ss();
    }
    t();
    console.log(color);

    结果:undefined   yellow   red    blue

    原因 :第一个:js没有块级作用域,所以相当于声明,但是未定义,结果是undefined;第二个:函数s中的定义了color变量,则输出yellow;

    第三个:函数ss中未声明定于color,则向作用域链上级查找,找到函数t中,结果是red;第四个:找到声明的color,结果是blue

    typeof检测变量的数据类型:
    "undefined"--值未定义
    "boolean"--布尔值
    "string"--字符串
    "number"--数值
    "object"--对象或者null
    "function"--函数

  • 相关阅读:
    Integer的十进制转二,八,十六进制
    Java内存模型
    python gui --tkinter
    图论-最短路径
    Java NIO
    浏览器关闭后,Session就销毁了吗?
    mysql查询最新一条数据
    MySQL 查看命令执行时间
    MySQL 删除devices表中id最大的一行
    MySQL中的联表查询与子查询
  • 原文地址:https://www.cnblogs.com/chenxiaocai/p/5473451.html
Copyright © 2011-2022 走看看