语法中常见的坑
块
{} instanceof Object;//SyntaxError
//以{开头的语句会被理解为块
没有块级作用域,只有函数作用域、全局作用域、eval作用域
for(var i=0;i<10;i++){ ... } { var j=1; } //i、j都不是局部变量
行尾的分号
分号表示语句的结束。大多数情况下,如果你省略了句尾的分号,JavaScript会自动添加。
!function(){ return { a:1 } }();
以上匿名函数最后执行结果是true,因为它实际上返回的是undefined。
变量声明
建议所有变量以var 声明,JavaScript会自动将变量声明"提升"(hoist)到代码块(block)的头部。
var v='Hello World'; (function(){ alert(v); var v='I love you'; })();
以上代码实际上等价于
var v='Hello World'; (function(){ var v; alert(v); v='I love you'; })();
for...in
使用for in循环便历对象或者数组的属性,会存在顺序不确定、受emumerable影响、会出现原型链上的属性等问题。
严格模式
除了正常运行模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。进入“严格模式”的标志,是下面这行语句:
"use strict";
- 不允许用with
- 所有变量必须声明, 赋值给为声明的变量报错,而不是隐式创建全局变量。
- eval中的代码不能创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,并在eval返回时丢弃。
- 函数中得特殊对象arguments是静`态副本,而不像非严格模式那样,修改arguments或修改参数变量会相互影响。
- 删除configurable=false的属性时报错,而不是忽略
- 禁止八进制字面量,如010 (八进制的8)
- eval, arguments变为关键字,不可作为变量名、函数名等
- 一般函数调用时(不是对象的方法调用,也不使用apply/call/bind等修改this)this指向null,而不是全局对象。
- 若使用apply/call,当传入null或undefined时,this将指向null或undefined,而不是全局对象。
- 试图修改不可写属性(writable=false),在不可扩展的对象上添加属性时报TypeError,而不是忽略。
- arguments.caller, arguments.callee被禁用
浙公网安备 33010602011771号