好程序员web前端教程之详解JavaScript严格模式

 好程序员 web前端教程之 详解JavaScript严格模式 严格模式 (Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,发布于2009年12月第五版。旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本。ES5严格模式是限制性更强的JavaScript变体,它与常规JavaScript的语义不同,其分析更为严格。

创新互联专注于企业全网营销推广、网站重做改版、临汾网站定制设计、自适应品牌网站建设、H5网站设计电子商务商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为临汾等各大城市提供网站开发制作服务。

  目前,除了IE6-9,其它浏览器均已支持ES5严格模式。

一、严格模式的使用

严格模式  的使用很简单,只有在代码首部加入字符串 “use strict”。有两种应用场景,一种是全局模式,一种是局部模式。

1)全局模式

'use strict' //code

2)局部模式

将”use strict”放到函数内的第一行,如下

function ()   {

     "use strict" ;

     //code }

二、严格模式下的执行限制

1)不使用var声明变量严格模式中将不通过

我们知道JS中,不使用var声明的变量默认转为全局变量。但在严格模式中将不允许,会报语法错误。

'use strict' g   =   100   //错误

比如for循环

'use strict' for   (i = 0 ;   i < 5 ;   i ++ )   {    //错误      console.log(i)}

2)任何使用’eval’的操作都会被禁止

'use strict' var   obj   =   {} var   eval   =   3 for   ( var   eval   in   obj)   {} function   eval ()   {} function   func( eval )   {}

3)eval作用域  JS中作用域有两种,全局作用域和函数作用域。严格模式带来了第三种作用域:eval作用域,如下

'use strict' var   a   =   10eval ( 'var a = 20; console.log(a)' );   //20 console.log(a)   //10

4)with被禁用

'use strict' var   obj   =   {

  name : 'zhangsan' ,

  age : 100 ,

  sex : '男' } with (obj)   {    //报错      console.log(name);

     console.log(age);

     console.log(sex);}

5)caller/callee 被禁用

function   func()   {

     'use strict'

     arguments.callee

     arguments.caller}func()

6)对禁止扩展的对象添加新属性会报错

'use strict' var   obj   =   {} Object .preventExtensions(obj)obj.a   =   1   // 报错

7)删除系统内置的属性会报错

'use strict' delete   Object .prototype      // 报错 delete   Function .prototype   // 报错

8)delete使用var声明的变量或挂在window上的变量报错

'use strict' var   obj   =   {a : 1 } window .a   =   1 delete   obj   // 报错 delete   a     // 报错

9)delete不可删除属性(isSealed或isFrozen)的对象时报错

'use strict' var   obj   =   {a :   1 } Object .seal(obj) delete   obj.a   //报错

10)对一个对象的只读属性进行赋值将报错

'use strict' var   obj   =   {} Object .defineProperty(obj,   'a' ,   {value :   1 ,   writable :   false })obj.a   =   2   // 报错

11)函数有重名的参数将报错

'use strict' function   func(a,   a)   {

     alert(a)}func()

而在非严格模式中,后面的同名参数将覆盖前面的。

12)八进制表示法被禁用

'use strict' var   num   =   022

13)arguments严格定义为参数,不再与形参绑定

function   func(a)   {

     arguments[ 0 ]   =   2

     alert(a)   // 2 }    func( 1 )

func调用时传参为1,函数内部通过arguments修改为2,此时alert的为修改后的2。 而在严格模式中则不能被修改,如下

'use strict' function   func(a)   {

     arguments[ 0 ]   =   2

     alert(a)   // 1 }    func( 1 )

14)函数必须声明在顶层

我们知道函数声明和函数表达式是两个不同的概念。一般函数声明都在最顶层,ES5前的JS宽松,你可以写在if或for内。当然Firefox的解析方式与其他浏览器不同,见SJ9002。而在严格模式中这些写法将直接报错

'use strict' if   ( true )   {

     function   func1()   {   }   // 语法错误 } for   ( var   i   =   0 ;   i   <   5 ;   i ++ )   {

     function   func2()   {   }   // 语法错误 }

15)ES5里新增的关键字不能当做变量标示符使用,如implements, interface, let, package, private, protected, public, static, yield

'use strict' var   let   =   10   //报错 var   yield   =   20

16)call/apply的第一个参数直接传入不包装为对象

'use strict' function   func()   {

     console.log( typeof   this )}func.call( 'abcd' )   // string func.apply( 1 )       // number

依次为”string”,”number”。而在非严格模式中call/apply将对值类型的”abcd”,1包装为对象后传入,即两次输出都为”object”。

17)call/apply的第一个参数为null/undefined时,this为null/undefined  这里以call来示例

'use strict' function   func()   {

     console.log( this )}func.call( undefined )   // undefined func.call( null )        // null

依次是undefined,null。而非严格模式中则是宿主对象,浏览器里是window,node.js环境则是global。

18)bind的第一个参数为null/undefined时,this为null/undefined  bind是ES5给Function.prototype新增的一个方法,它和call/apply一样在function上直接调用。它返回一个指定了上下文和参数的函数。当它的第一个参数为null/undefined时,情形和call/apply一样,this也为null/undefined。

'use strict' function   func()   {

     console.log( this )} var   f1   =   func.bind( null ) var   f2   =   func.bind( undefined )f1()   // null f2()   // undefined

而在非严格模式中输出的都是window(或global)。

“use strict” 的位置必须在首部。首部指其前面没有任何有效js代码。以下都是无效的,将不会触发严格模式。

a)“use strict” 前有代码,  无效

var   width   =   10 'use strict'   g   =   100

b)“use strict” 前有个空语句, 无效

; //这里是空语句 'use strict'    g   =   100

function   func()   {

     ;

     'use strict'

     g   =   200 }

function   func()   {

     ; 'use strict'

     localVar   =   200 }

当然,“use strict”前加注释是可以的

// strict mode 'use strict' g   =   100

function   func()   {

     // strict mode      'use strict'

     g   =   200 }func()


网站题目:好程序员web前端教程之详解JavaScript严格模式
网页URL:http://azwzsj.com/article/gcsdoj.html