`
zhouyrt
  • 浏览: 1126867 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ES5严格模式

阅读更多

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

 

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

 

一、严格模式的使用

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

1)全局模式

'use strict'
var globalVal = 100
console.log(globalVal)

 执行后输出了100,与非严格模式没什么区别。

 

2)局部模式

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

function func() {
    'use strict'
    var localVal = 200
    console.log(localVal)
}
func()

执行后输出了200,与非严格模式也没用什么区别。

 

3)模块模式

如果你想定义一个模块或者一个小库,自然采用一个匿名函数自执行是不错的选择

~function() {
    "use strict";
      
    // Define your library strictly...
}();

 

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

a)“use strict” 前有代码

var width = 10
'use strict'
globalVar = 100

b)“use strict” 前有个空语句都不行

;
'use strict'
globalVar = 100

function func() {
    ;
    'use strict'
    localVar = 200
}

function func() {
    ;'use strict'
    localVar = 200
}

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

// strict mode
'use strict'
globalVar = 100

function func() {
    // strict mode
    'use strict'
    localVar = 200
}
func()

 

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

上面举的两个例子,在严格模式中输出与普通模式没用什么区别。下面就不一样了。

 

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

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

'use strict'
globalVal = 100

执行,Firebug提示如下


 

又如全局的for循环

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

这种写法在非严格模式中很危险,i 会不小心溢出成为全局变量。但在严格模式中会报错

 

局部模式

function func() {
    'use strict'
    localVal = 200
    console.log(localVal)
}
func()

执行,Firebug报错

因此,严格模式中声明变量务必记得加一个var。 


 

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

'use strict'
var obj = {}
var eval = 3
obj.eval = 1
obj.a = eval
for (var eval in obj) {}
function eval() {}
function func(eval) {}
var func = new Function('eval')

Firebug报错



3)eval作用域

 

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

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

Firebug控制台依次输出了20,10。eval是在全局模式下(非函数内)的,如果不加严格模式,此时修改的是全局的a。即输出20,20。见 eval与window.eval的差别

 

4)with被禁用

'use strict'
with({a:1}) {
     
}

Firebug报错

 

5)caller/callee 被禁用

function func() {
    'use strict'
    arguments.callee
    arguments.caller
}
func()

Firebug报错


 

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

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

Firebug报错

 

 

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

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

Firebug报错



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

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

Firebug报错如下


 

 

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

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

Firebug报错如下



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

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

Firebug报错如下


 

11)对象有重名的属性将报错

'use strict'
var obj = {
    a: 1,
    a: 2
}

Firebug报错如下

而在非严格模式中,后面的属性将覆盖前面的属性,即obj.a等于2。

 

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

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

Firebug报错


 

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

 

 

13)八进制表示法被禁用

'use strict'
var num = 022

Firebug报错如下



 

14)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)

显示的严格的为传入的1。

 

其实有点还有点复杂,如果alert的是arguments[0],实际在严格模式中仍然被修改为2了。如下

'use strict'
function func(a) {
    arguments[0] = 2
    alert(arguments[0]) // 2
}   
func(1)

可以参考下 仅Chrome中函数实参与形参发生关联 

 

15)函数必须声明在顶层

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

'use strict'
if (true) {
    function func1() { } // 语法错误
}
for (var i = 0; i < 5; i++) {
    function func2() { } // 语法错误
}

Firebug报错

 

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

'use strict'
var let = 10
var yield = 20

Firebug报错

 

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

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

Firebug输出如下

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

 

18)call/apply的第一个参数为null/undefined时,this为null/undefined

这里以call来示例

'use strict'
function func() {
    console.log(this)
}
func.call(undefined) // undefined
func.call(null)      // null

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

 

19)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)。

 

相关:

Mozilla strict mode

http://msdn.microsoft.com/library/br230269.aspx

http://java-script.limewebs.com/strictMode/test_hosted.html

http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/

http://javascriptweblog.wordpress.com/2011/05/03/javascript-strict-mode/

JavaScript中delete操作符不能删除的对象 

 

  • 大小: 9.5 KB
  • 大小: 9.5 KB
  • 大小: 9.3 KB
  • 大小: 8.4 KB
  • 大小: 9.3 KB
  • 大小: 2.9 KB
  • 大小: 1.5 KB
  • 大小: 2.6 KB
  • 大小: 2.5 KB
  • 大小: 2.6 KB
  • 大小: 1.6 KB
  • 大小: 1.9 KB
  • 大小: 2 KB
  • 大小: 2.2 KB
  • 大小: 3.4 KB
  • 大小: 1.8 KB
  • 大小: 2.4 KB
分享到:
评论

相关推荐

    Xujie990604#HTML-CSS-Javascript-#es5 严格模式1

    两种用法:全局严格模式局部函数内严格模式(推荐)严格模式和ES3模式的区别改变作用域链的最顶端(将obj作为此代码块的作用域最顶端,通常配合命名空间使用)} /

    JavaScript思维导图——Day 12(try–catch,ES5严格模式)

    // try{ // console.log(a); // console.log(b); // console.log(c) ... //es5.0严格模式的启动 // function test() { // console.log(arguments.callee); // } // test(); // function de

    JoV5#blog#4.7 【ES5】严格模式与闭包1

    3. 访问arguments.callee或函数的caller属性将导致“类型错误(TypeError)” 4. 以下代码的执行效果与非严格模式并不一致:js

    .NET库,用于解析和执行JavaScript代码。-.NET开发

    什么是侏罗纪? 侏罗纪是ECMAScript语言和运行时的实现。 它旨在为.NET提供性能最佳,最符合标准JavaScript实现。 侏罗纪不适合e侏罗纪是什么?...功能支持所有ECMAScript 3和ECMAScript 5功能,包括ES5严格模式

    js this指向

    JavaScript this指向总结 在JavaScript中this永远指向当前函数的主人,即函数的...注:在es5严格模式下,this禁止指向window,会报错 对象的方法中,this指向调用当前方法的对象 var person = { username: 钢铁侠,

    ezjs:Rust的简单Javascript(ES5)运行时

    ezjs Rust提供了一个简单的Javascript(ES5)运行时。 一个纯Java的Rust实现(ES5严格模式),包括一个简单的字节码虚拟机。 整个设计灵感来自 。

    侏罗纪:.NET库,用于解析和执行JavaScript代码

    产品特点支持所有ECMAScript 3和ECMAScript 5功能,包括ES5严格模式经过良好测试-通过超过五千次单元测试(包含三万多个断言) 简单而强大的API 将JavaScript编译成.NET字节码(CIL); 不是口译员部署为单个.NET...

    es6函数之严格模式用法实例分析

    从es5开始,函数内部可以设定为严格模式。 function doSomething(a, b) { 'use strict' // code } es2016做了一点修改,规定只要函数参数使用了默认值,解构赋值,或者扩展运算符,那么函数内部就不能显示设定为...

    JavaScript起点(严格模式深度了解)

    严格模式(Strict Mode)是ECMAScript5新增的功能。ECMAScript5虽然可以向后兼容ECMAScript3,但如果使用严格...关于严格模式的大多数信息都可以在《ES5规范》[PDF]的第223页找到。 如何启用严格模式 可以在全局范围内使

    has-strict-mode:当前的JS环境是否具有严格模式? ES5 +应该; 但我们不要假设

    具有严格模式 当前的JS环境是否具有严格模式? ES5 +应该; 但我们不要假设。 例子 var hasStrictMode = require ( 'has-strict-mode' ) ; var assert = require ( 'assert' ) ; assert . equal ( hasStrictMode ( ...

    java俄罗斯方块源码-tetris-js:javascript中简单的俄罗斯方块实现

    java俄罗斯框源码俄罗斯方块JS 这是我编写的一个简单的俄罗斯方块实现,用于在 java ...严格模式下完成的。 所以需要兼容 ES5 的浏览器才能运行游戏。 带注释的完整源代码为 14K。 缩小版为 3.5K。

    ECMAScript 5严格模式(Strict Mode)介绍

    严格模式(Strict Mode)是ECMAScript 5的新特性,它允许你把整个程序,或者某个函数,放置在“严格”的操作语境中。这种严格的语境会防止...关于严格模式的大多数信息都可以在《ES5规范》[PDF]的第223页找到。 (注意

    带你学习javascript的函数进阶(二)

    上一篇文章分享了《带你学习Javascript中的函数进阶(一)》,今天继续学习javascript的函数进阶的内容。 文章目录1 严格模式1.1 什么是严格模式1.2 开启严格模式3.3 严格...ES5的严格模式是采用具有限制性Javascript

    yuxingxingya#Make-progress-every-day#JS ES5 作用域1

    声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的// 在严格模式(strict mode)下会抛出 ReferenceError 异常// 打

    es6面向对象详细总结,超全超详细

    适合于和我一样的学习前端的人,可以深入了解或者复习一下es6,这个word文档中包含《 类、构造函数和原型对象、原型链查找机制、this指向问题、继承、扩展内置对象、es5新增的方法、立即执行函数、闭包、严格模式、高...

    JavaScript思维导图

    JavaScript思维导图,详细介绍作用域,函数,构造函数,ES5,ES6,数组高阶函数。...对增严格模式的介绍?详细介绍ES6新特性,这个面试的时候也会问道(参数,语法,数组,箭头函数,字符串,let、const等等)。

    浅谈js的解析顺序 作用域 严格模式

    一、javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的。...1.ES5中有声明意义的关键字 var 会存在变量提升 function也有声明变量的的作用。 2.解析顺序 1.找声明 var

    schematic-js:向模型添加JSON模式支持

    #schematic-js基于ES5 JSON架构的模型支持库。 概述 Schematic-js向基于模型的javascript应用程序添加了JSON模式支持。 JSON模式( )为数据模型提供了声明式结构和验证,从而使它们在应用程序中的行为更加可预测。...

    ics.js:RFC 5545 (iCalendar) 的 JS 实现

    没有运行时依赖的纯 JavaScript(ES5,严格模式)。 Node.js 和浏览器兼容性。 安装 节点.js 您可以在本地安装它: $ npm install icsjs 或者您可以将其添加为package.json的依赖项: { " dependencies " : {...

    eslintrc:我自己的一个JavaScript样式指南。 (已弃用)

    适用于 ,但有以下更改: 删除了ES6 / babel /React的东西var可以在任何地方声明,而不仅是在顶部严格模式设置为全局(因为Node && browserify =&gt;每个模块都包装在自己的闭包中,这样就可以了;我也不想使用自动...

Global site tag (gtag.js) - Google Analytics