语法中常见的坑

{} 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被禁用
posted on 2015-11-06 22:11  cbwleft  阅读(79)  评论(0)    收藏  举报