当前位置: 首页 > 编程日记 > 正文

在JS中最常看到切最容易迷惑的语法(转)

发现一篇JS中比较容易迷惑的语法的解释,挺有用的,转载下,与大家分享:

js中大括号有四种语义作用

语义1,组织复合语句,这是最常见的

Js代码
  1. if( condition ) {
  2. //...
  3. }else {
  4. //...
  5. }
  6. for() {
  7. //...
  8. }

if( condition ) {//...
}else {//...
}
for() {//...
}

语义2,对象直接量声明

Js代码
  1. var obj = {
  2. name : 'jack',
  3. age : 23
  4. };

var obj = {name : 'jack',age : 23
};

整个是个赋值语句,其中的{name:'jack',age:23}是个表达式,单独存在也不会出现语法错误的。

语义3,声明函数或函数直接量

Js代码
  1. function f1(){
  2. //...
  3. }
  4. var f2 = function(){
  5. //...
  6. }

function f1(){//...
}var f2 = function(){//...
}

f1与非f2的区别是前者在语法解释期,后者在运行期。区别在于:如果调用该函数的代码在函数定义之后,则没有区别;如果调用该函数的代码在函数定义之前,则f1仍然可以调用,f2则会报错,提示f2未定义。

语义4,结构化异常处理的语法符号

Js代码
  1. try {
  2. //...
  3. }catch( ex ){
  4. //...
  5. }finally{
  6. //...
  7. }

try {//...
}catch( ex ){//...
}finally{//...
}

这里的大括号与符合语句(语义1 )是有区别的,大括号中如果只有一条语句,在if/else/for等中大括号是可以省略的,但try/catch/finally则不能省略。

以下代码纠结了偶N久

Js代码
  1. function(){}() //匿名函数立即执行, 语法分析期报错
  2. {}.constructor //获取对象直接量的构造器,语法分析期报错

function(){}() //匿名函数立即执行, 语法分析期报错{}.constructor //获取对象直接量的构造器,语法分析期报错

令人不解的是为何[].constructor这么写却不报错呢,一个是想获取对象直接量的构造器,一个是获取数组直接量的构造器而已。

当然添加个变量接收也不会报错

var c = {}.constructor;

同样的情况如

var fn = function(){}(),也不会报错。

实际上是js的“语句优先”在作怪,即{}被理解成复合语句块(语义1 )而不是对象直接量(语义2 )或声明函数(语义3 )的语义。

function(){}(),大括号被理解成复合语句,自然前面的function()声明函数的语法不完整导致语法分析期出错。
{}.constructor,大括号被理解成复合语句,大括号后面是点运算符,点运算符前没有合理的对象自然也报错。

修复方式众所周知:加个强制运算符()
(function(){})(),(function(){});//强制其理解为函数(语义3 ),“函数()”表示执行该函数,即声明后立即执行了。
({}).constructor //({})强制把大括号理解成对象直接量(语义2 ),“对象.xx”表示获取对象的成员,自然后面的点运算符可以正常执行了。

转自:http://www.javaeye.com/topic/667861

总结:

从该文章可以看出,JS 在语法解析期和运行期对JS语法的解释是略微有点不同的,写法上有以下注意:

var b=function(){}(); //运行期 当然 var b=(function(){})();也可以

(function(){})()//语法解析期只能这样写

延伸:JQUERY插件编写需要预先运行篇

如果注意一些JQ插件,你经常会发现以下代码:

(function($){$(function(){/*code*/})}($))

如果你看了上面的文章,你就会发现为什么会有这个东西了,很多JQ的插件都需要在没有使用的时候就预先运行的,

不过我编写的时候到很少遇到会写这样的插件.

通过以上的方法注册的JQ插件的全局变量不会污染JS环境的全局变量.如果没有全局变量的插件当然可以不这样写,其实JQ对插件全局变量的储存也有相应的替换方案,就是用$(this).data("var","value")来储存相应的插件全局数据,如果插件不需要预先运行的,又要存放插件的全局数据,用以上的两个方法都可以,根据自己喜欢的做吧~

转载于:https://www.cnblogs.com/liushannet/archive/2010/10/28/1863941.html

相关文章:

三、类型设计规范

一、类型的逻辑分组从CLR的角度来看,只有两种类型:引用类型和值类型。但从框架设计来说,可以进行更细致的分类 1、引用类型,包括:类、静态类、集合、数组、异常、属性2、值类型,包括:枚举和结构…

使用mybatis一次性添加多条数据 在oracle 数据库上

1、sql 语句 #sql 语句 insert into STD_XXXX (表名) (ID,NAME,CLASSNAME ) select STD_XXX_SEQUENCE.Nextval,(自增序列名称) XXX.* from (select 1,3 from dual unionselect 2,3 from dual)XXX 2、mybatis #多条插入 &…

使用SharpPCap在C#下进行网络抓包

转自http://www.cnblogs.com/billmo/archive/2008/11/09/1329972.html 在做大学最后的毕业设计了,无线局域网络远程安全监控策略那么抓包是这个系统设计的基础以前一直都是知道用winpcap的,现在网上搜了一下,有用C#封装好了的,很好用下面是其中的几个用法这个类库作者的主页:ht…

Spring Security的RBAC数据模型嵌入

1.简介 ​ 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得…

实用Jquery开发自己的插件

实用Jquery开发自己的插件 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。 jQuery.fn.extend(object);给jQuery对象添加方法。 fn 是什么东西呢。查看jQuery代码,就不难发现。 jQuery.fn jQuery…

无线网中的一些技术名词和解释

现在大家到处都可以听到在说WLAN,到底 个WLAN是什么意思呢?WLAN:Wireless Local Area Network的缩写,也是无线局域网的意思。AP:Access Point,无线接入器,常常缩写为AP。SSID:也缩写国ESSID&…

说到心里的哲理个性签名 学生时代的恋爱无非就是陪伴二字

学生时代的恋爱无非就是陪伴二字 也许因为得不到所以空想总是美好 . 让一个男人哭了 没错你赢了 但是你玩大了 曾经我们都那样嚣张后来怎么也学会了退让. 爱一个人成为习惯就会失去放手的勇敢. 有时沉默并不是因为词穷而是因为心空. 前任也曾是对的人 别打听我我没故事可说. 你…

切换用户启动程序

#!/bin/bash su - elasticsearch <<EOF /opt/elasticsearch-6.6.2/bin/elasticsearch -d exit EOF转载于:https://www.cnblogs.com/divl/p/10826803.html

即将到来的日子 ,你会寂寞吗?

见到如此的数字&#xff0c;不知道身边的你是否会想起一些往事&#xff0c;我想这一刻很难去形容&#xff0c;因为哥也会有寂寞的一天。 从来不太喜欢的节日&#xff0c;但是每逢到来的时候&#xff0c;总会有一阵阵的痛。今天不是好的节日&#xff0c;在地球上某一个角落&…

Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

目录 1、Mybatis 获取当前序列和下一个序列值 2、Mybatis 在一个方法中写多条SQL 语句 1、Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_sequence.currval from dual#获取下一个序列值 select XXX_sequence.Nextval from dual2、Mybatis 在一个方法中写多条…

MikuMikuDance 6 菜单汉化补丁

MikuMikuDance是日本人樋口优所开发&#xff0c; 将VOCALOID2的初音未来等角色制作3D模组的免费软件。 简称为MMD。 汉化过程中 有同学反映 原来4.0 完全汉化版会出错 而不得不用回原版故这次 汉化仅汉化菜单部分 理论上不会出错如果是日文模式请选择ヘルプ(&H)-&…

收缩临时库 shrink tempdb

tempdb实际占用空间40mb,文件大小70G, 原始大小2GB 无法使用dbcc shrinkfile进行收缩. 看到的解决方案是 重启数据库DBCC FREESYSTEMCACHE (ALL) ,然后再收缩.http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/7b45f0de-2aa3-4de0-930b-d9d0fe931b3a http…

H5如何测试?

它跟安卓APP与IOS APP有什么样的区别呢&#xff1f;★ 我们以往的APP是使用原生系统内核的&#xff0c;相当于直接在系统上操作&#xff0c;是我们传统意义上的软件&#xff0c;更加稳定★ H5的APP先得调用系统的浏览器内核&#xff0c;相当于是在网页中进行操作&#xff0c;较…

二维数组练习--矩阵的加法和乘法

数组的练习示例展示&#xff1a; package arrayList; /*** 矩阵的集中运算法则&#xff1a;求和&#xff0c;求积&#xff0c;求逆矩阵&#xff0c;转置矩阵......* author Drew**/ public class Arrays {/*** 两个二维数组&#xff08;矩阵&#xff09;求和。* param a 矩阵&a…

文件分享微信小程序的设计与开发 Java开发微信小程序 毕业设计

目录 使用的技术 2、功能介绍 3、此小程序未部署 所以体验不了 4、如何联系我或需要源码进行联系 使用的技术 SpringbootMybatisMysql 微信小程序Mpvue 1、小程序展示 后台管理 2、功能介绍 用户第一次使用小程序 用户授权上传视频和图片设置密码和有效期分享给微信好友…

Silverlight 3发布新版3.0.50106.0

微软1月19日发布Silverlight 3新版本3.0.50106.0.该版本主要修复以下几个问题&#xff1a;问题一&#xff1a; 当使用图形硬件加速功能&#xff08;GPU&#xff09;的时候&#xff0c;如果GPU驱动报错&#xff0c;Silverlight 3应用将不再正确显示内容。该问题是因为Silverligh…

递归该怎么写(二)

对于简单的递归&#xff08;可以写出数学表达式的递归&#xff09;&#xff0c;我们已经熟练掌握&#xff0c;但是对于有些递归我们有时候无从下手。这时候我们需要将抽象的问题数学化&#xff0c;或者能表达出来。 &#xff08;本节需要掌握&#xff1a; 熟悉递归函数的返回是…

chrome 浏览器打开静态html 获取json文件失败 解决方法

如图加&#xff1a; --allow-file-access-from-files

个人站立会议6

昨天做&#xff1a; 软件的出租功能部分 遇到问题&#xff1a; jsp 与数据库的连接 解决方法&#xff1a;查找资料&#xff0c;向他人请教。 今天做&#xff1a; 软件的出租功能部分。转载于:https://www.cnblogs.com/luohaochi/p/8092589.html

IIS配置跨服务器迁移

这几天&#xff0c;因为服务器要重装&#xff0c;要将此服务器的IIS网站搬到别一台服务器&#xff0c;因运行在此服务器上的站点有200多&#xff0c;不可能手动去重新设置&#xff0c;在网上找了一些迁移的工具&#xff0c;效果不理想&#xff0c;仔细研究IIS后&#xff0c;终天…

Express4.x API (四):Router (译)

Express4.x API 译文 系列文章 Express4.x API (一)&#xff1a;application (译) -- 完成Express4.x API (二)&#xff1a;request (译) -- 完成Express4.x API (三)&#xff1a;Response (译) -- 完成Express4.x API (四)&#xff1a;router (译) -- 完成已经完成了Express4.…

JavaScript(转载)

正则表达式用于字符串处理&#xff0c;表单验证等场合&#xff0c;实用高效&#xff0c;但用到时总是不太把握&#xff0c;以致往往要上网查一番。我将一些常用的表达式收藏在这里&#xff0c;作备忘之用。 匹配中文字符的正则表达式&#xff1a; [\u4e00-\u9fa5]匹配双字节字符…

复杂JSON参数传递后台处理方式

如图 或者使用 requestBoby 注解

shift()函数

用于对dataframe中的数整体上移或下移&#xff0c; 当为正数时&#xff0c;向下移。 当为负数时&#xff0c;向上移。 缺少的会填充NaN 参考&#xff1a; https://blog.csdn.net/kizgel/article/details/78333833 转载于:https://www.cnblogs.com/xxswkl/p/10831152.html

linux系统管理学习笔记之三----软件的安装

linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02标签&#xff1a;linux 系统管理    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。htt…

Vue+element UI实现“回到顶部”按钮组件

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/caomage/article/details/85006973 背景 开发框架是vuewebpackelement-ui&#xff0c;需要一个回到顶部的通用组件。 开发 HTML部分 code&#xff1a; <template><t…

根据xml 文件生成 xsd文件 以及相关测试方法

1、下载trang.jar 下载地址&#xff1a; http://www.java2s.com/Code/Jar/t/Downloadtrang20091111jar.htm 2、用法介绍 将trang.jar 包 和xml 文件放到同一个目录下 执行以下命令 java -jar trang.jar a.xml a.xsd 3、测试类 public class CheckXML {public static voi…

十一运夺金基础数据采集工具

点击下载 转载于:https://www.cnblogs.com/JiangHuakey/archive/2010/11/17/1880139.html

[HNOI 2010]Bounce 弹飞绵羊

Description 某天&#xff0c;Lostmonkey发明了一种超级弹力装置&#xff0c;为了在他的绵羊朋友面前显摆&#xff0c;他邀请小绵羊一起玩个游戏。游戏一开始&#xff0c;Lostmonkey在地上沿着一条直线摆上n个装置&#xff0c;每个装置设定初始弹力系数ki&#xff0c;当绵羊达到…

WordPress首页调用QQ签名

我的博客&#xff1a;http://Yourtion.TK 看到我的博客的朋友一定注意到我的页面旁边一个QQ签名的实时显示&#xff0c;如下图&#xff1a; 是怎么实现的呢&#xff1f;&#xff1f;下面一步步告诉你。希望对你有帮助。 首先登陆QQ滔滔首页&#xff1a;http://www.taotao.com/并…