• 复习JavaScript 1


      最近发现JavaScript有些基本概念模糊,趁这个机会学习下 @汤姆大叔 的《深入理解JavaScript》系列,复习记录下遗忘的基础知识。在此感谢汤姆大叔!

      一、编写高质量JavaScript代码的基本要点

      1、全局变量

      隐式全局变量和明确定义的全局变量间的不同:

    •  通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
    •  无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
    • // 定义三个全局变量
      var global_var = 1;
      global_novar = 2; // 反面教材
      (function () {
         global_fromfunc = 3; // 反面教材
      }());
      
      // 试图删除
      delete global_var; // false
      delete global_novar; // true
      delete global_fromfunc; // true
      
      // 测试该删除
      typeof global_var; // "number"
      typeof global_novar; // "undefined"
      typeof global_fromfunc; // "undefined"

      2、访问全局变量的方法

           确保自己在任何情况访问的都是全局变量:

    var global = (function () {
       return this;
    }());

      在strict模式下以上代码不行。

      3、函数中变量的预解析

    // 反例
    myname = "global"; // 全局变量
    function func() {
        alert(myname); // "undefined"
        var myname = "local";
        alert(myname); // "local"
    }
    func();

      在函数中任意位置的var语句都会在函数顶部预先声明。于是上面代码等同于

    myname = "global"; // global variable
    function func() {
       var myname; // 等同于 -> var myname = undefined;
       alert(myname); // "undefined"
       myname = "local";
       alert(myname); // "local"}
    func();

      所以应该弹出的是

      undefined
      
    local

      代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数创建,这是一个解析和进入上下文 的阶段。第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被创建。但是,出于实用的目的,我们就采用了”hoisting”这个概念, 这种ECMAScript标准中并未定义,通常用来描述行为。  

       4、eval()和new Function()

      尽量不要使用eval(),它会干扰作用域链。必须使用时可以考虑用Function()代替。

      如下eval()可以访问和修改外部作用域: 

    (function () {
       var local = 1;
       eval("local = 3; console.log(local)"); // logs "3"
       console.log(local); // logs "3"
    }());
    
    (function () {
       var local = 1;
       Function("console.log(typeof local);")(); // logs undefined
    }());

      5、parseInt()和数值转换  

    var month = "06",
        year = "09";
    month = parseInt(month, 10);
    year = parseInt(year, 10);

      parseInt(year)最好指定技术参数,否则'09'会被当做8进制的数。(ECMAScript 5中不会,已经在最新chrome和Safari中尝试parseInt(year)默认是10进制的)。

      其他字符串转换成数字方法:

    +"08" // 结果是 8
    Number("08") // 8

        


    感谢@汤姆大叔 的《深入理解JavaScript》系列指导我学习!

      

  • 相关阅读:
    Unity 向量点乘、叉乘
    为什么叫Unity3d为脚本语言
    Unity 围绕X、Y、Z旋转图例
    Kafka系列三之单节点多Broker部署
    Debezium SQL Server Source Connector+Kafka+Spark+MySQL 实时数据处理
    Debezium SQL Server Source Connector+Kafka+Spark+MySQL 实时数据处理
    Kudu遇到的坑,是真的坑~
    MySQL binlog浅析
    Kudu单机安装 【很简单】
    mybatis-plus坑之insert方法
  • 原文地址:https://www.cnblogs.com/ltchronus/p/3527498.html
Copyright © 2020-2023  润新知