美文网首页
JavaScript-语句和变量

JavaScript-语句和变量

作者: 能吃饭也能吃苦1236 | 来源:发表于2018-05-11 13:33 被阅读0次

    语句

    • JavaScript按行执行,一行就是一个语句,而语句是为了完成某种任务而进行的操作,语句以分号(;)结尾,如:
    var i = a + b; /*用var声明变量i,然后将a+b的值赋给i;a+b为表达式*/
    
    • 表达式结尾没有分号,一旦在表达式后面添加分号,则 JavaScript 引擎就将表达式视为语句,这样会产生一些没有任何意义的语句。如:


      1.png

    变量

    • 变量就是给值取名字,变量的名字叫变量。
    • JavaScript变量名区分大小写,A和a是两个不同的变量。
    • var,变量声明命令,它表示通知解释引擎,要创建一个变量。变量赋值不写var不会报错,但会很容易产生全局变量。
    • 变量的声明和赋值。
    var i = a + b; 
    /*实际上,变量的声明和赋值分为两个步骤*/
    var i; /*声明变量i*/
    i = a + b; /*将表达式a+b的值赋给变量a*/
    
    • 只声明变量却不赋值,该变量的值为undefined。


      2.png
    • 使用变量前要先声明,不然会报错。


      3.png
    • 变量的类型没有限制,变量可以随时更改类型。
    var i = 1;
    var i = 'abc';
    
    • 声明已经存在的变量是无效的。
    var i = 1;
    var i; /*此处声明为无效的*/
    
    • 重复声明同一个变量并且赋值,后面的值会把前面的值覆盖掉。
    var i = 1;
    var i = 2;
    /*最终i的值为2*/
    
    • 变量提升
    声明一个函数hello
    function hello() {
      elem = document.getElementById("demo");
      elem.innerHTML = x; 
      var x = 5;
    }
    
    这个 var x = 5, 可以认为是两条语句,等价于
    var x;   // 只有定义(声明)会提升
    x = 5;  //  初始化值(赋值)这个操作,并不会被提升。
    

    所以上面函数相当于:

    function hello() {
      var x;   // 提升到这了, 默认值为undefined。
      elem = document.getElementById("demo");
      elem.innerHTML = x;    // 这个时候值还是undefined
      x = 5;
    }
    

    而函数声明,是一个语句,会被提升:

    function hello() {
      var elem =  document.getElementById("demo");
      elem.innerHTML = ...
    
      function ok() {    // 这是个函数声明语句,会被整体提升
        console.log('ok')
      }
    }
    

    相当于:

    function hello() {
      function ok() {    // 相当于写到最前面了。
        console.log('ok')
      }
    
      var elem =  document.getElementById("demo");
      elem.innerHTML = ...
    }
    这也是为什么说,js的变量作用域是函数作用域的(C,Java等语言的作用域是块级作用域)。因为所有的var和函数声明语句,都会被提升,相当于写在函数的顶部。
    

    这也能初步解释在循环中绑定事件:

    function test() {
      for (var i = 0; i < lis.length; i++) {
        lis[i].addEventListener('click', function() {
          console.log(i);   // 点击时总是输出 lis.length这个值
       });  
      }
    }
    

    因为上面的代码在变量提升后,相当于:

    function test() {
      var i;  // 被提升到这里了,一个函数中就一个i。
      for (i = 0; i < lis.length; i++) {
        lis[i].addEventListener('click', function() {
          console.log(i);   // 点击时,i的值固定为循环完成的值。
        });  
      }
    }
    

    课上给的方法是:

    function test() {
      for (var i = 0; i < lis.length; i++) {
        addEvent(i);
      }
      // 调用这个函数多次,每个index都是独立的
      function addEvent(index) {
        lis[index].addEvent('click', function() {
          console.log(index);
        });
      }
    }
    
    elem.innerHTML = x;     // 这个x实际上是未定义,所以会报错的,报错了就显示不出来了
    x = 5;    // 这句话在浏览器,非use-strict模式下会执行成功,表现为给window设置了一个属性, 可以使用 window.x 查看。 
    

    相关文章

      网友评论

          本文标题:JavaScript-语句和变量

          本文链接:https://www.haomeiwen.com/subject/aetfdftx.html