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


Posted in Javascript onOctober 29, 2010

js中大括号有四种语义作用
语义1,组织复合语句,这是最常见的

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

语义2,对象直接量声明
var obj = { 
name : 'jack', 
age : 23 
};

整个是个赋值语句,其中的{name:'jack',age:23}是个表达式,单独存在也不会出现语法错误的。
语义3,声明函数或函数直接量
function f1(){ 
//... 
} 
var f2 = function(){ 
//... 
}

f1与非f2的区别是前者在语法解释期,后者在运行期。区别在于:如果调用该函数的代码在函数定义之后,则没有区别;如果调用该函数的代码在函数定义之前,则f1仍然可以调用,f2则会报错,提示f2未定义。
语义4,结构化异常处理的语法符号
try { 
//... 
}catch( ex ){ 
//... 
}finally{ 
//... 
}

这里的大括号与符合语句(语义1 )是有区别的,大括号中如果只有一条语句,在if/else/for等中大括号是可以省略的,但try/catch/finally则不能省略。
以下代码纠结了偶N久
function(){}() //匿名函数立即执行, 语法分析期报错 
{}.constructor //获取对象直接量的构造器,语法分析期报错

令人不解的是为何[].constructor这么写却不报错呢,一个是想获取对象直接量的构造器,一个是获取数组直接量的构造器而已。
当然添加个变量接收也不会报错
var c = {}.constructor;
同样的情况如
var fn = function(){}(),也不会报错。
实际上是js的“语句优先”在作怪,即{}被理解成复合语句块(语义1 )而不是对象直接量(语义2 )或声明函数(语义3 )的语义。
function(){}(),大括号被理解成复合语句,自然前面的function()声明函数的语法不完整导致语法分析期出错。
{}.constructor,大括号被理解成复合语句,大括号后面是点运算符,点运算符前没有合理的对象自然也报错。
修复方式众所周知:加个强制运算符()
(function(){})(),(function(){});//强制其理解为函数(语义3 ),“函数()”表示执行该函数,即声明后立即执行了。
({}).constructor //({})强制把大括号理解成对象直接量(语义2 ),“对象.xx”表示获取对象的成员,自然后面的点运算符可以正常执行了。

延伸:JQUERY插件编写需要预先运行篇
如果注意一些JQ插件,你经常会发现以下代码:
(function($){$(function(){/*code*/})}($))
如果你看了上面的文章,你就会发现为什么会有这个东西了,很多JQ的插件都需要在没有使用的时候就预先运行的,不过我编写的时候到很少遇到会写这样的插件.不过很多时候也有好处的~~

Javascript 相关文章推荐
用于节点操作的API,颠覆原生操作HTML DOM节点的API
Dec 11 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
页面按钮禁用与解除禁用的方法
Feb 19 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
Nov 23 Javascript
原生js结合html5制作小飞龙的简易跳球
Mar 30 Javascript
用js读写cookie的简单方法(推荐)
Aug 08 Javascript
AJAX和jQuery动态加载数据的实现方法
Dec 05 Javascript
vue.js获取数据库数据实例代码
May 26 Javascript
Vue 实现树形视图数据功能
May 07 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
layui表格 返回的数据状态异常的解决方法
Sep 10 Javascript
ExtJS 入门
Oct 29 #Javascript
js 弹出框 替代浏览器的弹出框
Oct 29 #Javascript
javascript天然的迭代器
Oct 29 #Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
Oct 29 #Javascript
js类型检查实现代码
Oct 29 #Javascript
JavaScript继承方式实例
Oct 29 #Javascript
拖动布局之保存布局页面cookies篇
Oct 29 #Javascript
You might like
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
Javascript的this用法
2017/01/16 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Django中的session用法详解
2020/03/09 Python
关于Django Models CharField 参数说明
2020/03/31 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
毕业生自荐书
2014/02/02 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
食品安全演讲稿
2014/09/01 职场文书
鲁迅故居导游词
2015/02/05 职场文书
安全保证书怎么写
2015/02/28 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android