• JS自动填写分号导致的坑


      JS中会自动清除句子和句子之间的空格以及tab缩进, 这样就可以允许用户编写的代码更加随性和更加可读, 在该行代码解析的时候如果该行代码可以解析, 就会在该行代码最后自动填写分号,如果该行代码无法解析就会把该行代码和下一句代码合并, 直到代码可以解析;

      Js中如果一个语句以  (  [ / + -  开头,就有可能与上一句合在一起解析

      也因为js会自动添加 “;” , 写js不注意就养成了不好的习惯, 代码有时候没事, 跑起来却出了错;

      比如,少了一个分号就报错了;

    var a
    y = 1+a
    (a+y).toString();

      我们期望他这么走:

    var a
    y = 1+a;
    (a+y).toString();

      实际上是这样的:

    var a
    y = 1+a(a+y).toString();

      比如,这个也是因为少了一个分号

    var a = 0
    [a,2,3].forEach(function(){})

      我们期望他这么走的:

    var a = 0;
    [a,2,3].forEach(function(){})

      实际上是这样的:

    var a = [a,2,3].forEach(function(){})


      也因为js的自动添加分号机制,有下面的问题, 虽然很少人这么写:

    x = 0;
    y = 0;
    x
    ++
    y;

      我们期望的是这样的:

    x = 0;
    y = 0;
    x++;
    y;

      实际上是这样的:

    x = 0;
    y = 0;
    x;
    ++y;


      js并不是所有的换行都添加分号, 只有缺少了分号无法执行的时候才添加分号,如:

    var a
    b
    =
    3
    console.log(b);

      也因为js的自动添加分号机制;

    function(){}() 这句话会变成这样:
    function(){};
    ();

      如果期望他正常执行,(汤姆大叔的例子);

    // 下面2个括弧()都会立即执行
    (function () { /* code */ } ()); // 推荐使用这个
    (function () { /* code */ })(); // 但是这个也是可以用的
    
    // 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的
    // 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了
    // 不过,请注意下一章节的内容解释
    
    var i = function () { return 10; } ();
    true && function () { /* code */ } ();
    0, function () { /* code */ } ();
    
    // 如果你不在意返回值,或者不怕难以阅读
    // 你甚至可以在function前面加一元操作符号
    
    !function () { /* code */ } ();
    ~function () { /* code */ } ();
    -function () { /* code */ } ();
    +function () { /* code */ } ();
    
    // 还有一个情况,使用new关键字,也可以用,但我不确定它的效率
    // http://twitter.com/kuvos/status/18209252090847232
    
    new function () { /* code */ }
    new function () { /* code */ } () // 如果需要传递参数,只需要加上括弧()

       

      如果有返回值, 比如return, break , continue的代码后面也不能换行, 导致维护的时候出了问题都无从找起;

    //如果这么写,实际上return的是空值;
    +function(){
        return 
        {a:1}
    }();
    
    //这个才是对的
    +function(){
        return  {a:1}
    }()

      所以,写js还是老老实实的加分号吧;

      ok了,说了这么多,反正我不写分号O(∩_∩)O哈!

  • 相关阅读:
    POJ 3267 The Cow Lexicon(动态规划)
    POJ 1125 Stockbroker Grapevine(最短路径Floyd算法)
    HDU 2374 || SDUT2386 A Game with Marbles(简单题)
    JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
    基于SNMP的MIB库访问实现的研究
    一个兼容大多数浏览器 的 图片滚动的js
    C#获取本地计算机名,IP,MAC地址,硬盘ID
    中文首字母搜素的实现 sql函数
    xml文档的加密与解密
    修改Windows 2003 server远程桌面端口3389
  • 原文地址:https://www.cnblogs.com/diligenceday/p/4391961.html
Copyright © 2020-2023  润新知