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哈!

时间: 2024-10-28 19:56:37

JS自动填写分号导致的坑的相关文章

防止 JavaScript 自动插入分号

JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符. 然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,因此程序可以利用空格格式化代码. 这两种机制的冲突,很容易掩盖更为严重的解析错误.有时会不合时宜地插入分号. 例如,在return语句中自动插入分号将会导致这样的后果: 如果return语句要返回一个值,这个值的表达式的开始部分必须和return在同一行上,例如: var f = f

js实现填写身份证号、手机号、准考证号等信息自动空格的效果

咱们做网站的,用户体验那是相当重要的,比如12306抢票需要填写身份证,如果不空格,密密麻麻的给我一种很压抑的感觉,而且也不容易核对信息是否填写正确,所以我就写了一个利用Js实现填写身份证号.手机号.准考证号等信息自动空格的效果. 为了方便,自已定义的一个简单的get()方法和trim()方法,代码如下: //获取对应的对象--function函数. function get(id) { return document.getElementById(id); } //去掉所有空格--String

Qt自动填写表单并点击按钮,包括调用js方法

本篇博客参阅了很多其他大牛的文章,具体找不到了,还望包涵>_< 因为其他博客大都是只有主要代码,对于像我这种菜鸟,根本摸不着头脑,以此想总结一下,帮助新手尽快实现功能... 主要是调用了Com接口来操作浏览器(仅限于ie),并且获取dom,然后来自动填写或者点击按钮等操作,具体看代码 在写代码之前,遇到的第一个坑就是导入mshtml.h报错问题 (未完待续) 原文地址:https://www.cnblogs.com/hyuganatsu/p/qt-dom.html

如果您想省略JS里的分号,了解一下JS的分号插入原理吧

仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 function square(x) { var n = +x return n * n } 但是却不可以写的像下面代码一样,这样就报错了哦 function area(r) { r = +r return Math.PI*r*r }//error 仅在随后的输入标记不能解析时插入 也就是说分号插入是一种错误校正机制.看代码说话 a = b (f())

chrome 自动填写表单插件

主要功能是打开任意网页插件会自动判断URL是否是form.php结尾,如果是则按照规则自动填写网页表单,如果不是则略过. Manifest.json { "name": "智能表单助手", "description": "自动填充***申请友情链接表单", "version": "1.0", "permissions": [ "tabs", &qu

CCFLOW如何使用“脚本验证”自动填写表单中的RMB(大写)金额字段

如何使用"脚本验证"自动填写表单中的RMB(大写)金额字段 需求: 表单中有两个字段,一个字段为手工录入的RMB金额(小写),另一个字段需要填写该金额对应的大写形式. 目标: 录入RMB金额(小写)时,RMB金额(大写)文本框自动生成金额的大写形式. 设置步骤: 1.更新"\DataUser\JSLib\onkeyup\01.RMB转大写形式.js"文件: 2.打开节点自由表单设计器,单击工具栏上的"扩展设置"按钮,打开表单扩展设置界面.点击左侧

自动填写表单有风险吗?

使用一些方法获得 Cookie,即使能控制账号,但其密码仍无法得知,随时都有可能失去控制权,一些用户有让浏览器自动保存密码的习惯.通过这点,是否能套出记住的密码来呢?  分析下浏览器是如何自动填写页面表单的.其实很简单,浏览器发现页面 URL 和表单名匹配记录里的,就自动填上了. 要是在流量可控的网络里,剥离页面所有内容只剩表单,又会如何?  保存着的密码仍能自动填上,并且可被脚本访问到! 如果在用户访问的页面里,创建大量的隐藏框架页,即可尝试获取各种网站保存着的账号了.(不过如今 Chrome

盒子 收藏帖子 转移-实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录

//实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录 Function FillForm(WebBrowser: TWebBrowser2; FieldName: String; Value: String): Boolean; Var i, j: Integer; FormItem: Variant; Begin Result := False; //no form on document If WebBrowser.OleObject.Document.all.tags('FO

webstorm 不知道手贱点了什么,有时候会自动删除分号

https://segmentfault.com/q/1010000009184137?_ea=1845711 webstorm 不知道手贱点了什么,有时候会自动删除分号 webstorm javascript 繁忙的耗子 4月25日提问 关注 4 关注 收藏 0 收藏,470 浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键内容,没有改进余地 怎么恢复过来? 4月25日提问 评论 邀请回答 编辑 默认排序时间排序 3个回答 答案对人有帮助,有参考价值0答案没帮助,是错