Javascriptg 严格模式

来源:互联网 发布:网络暴力的现状 编辑:程序博客网 时间:2024/06/06 11:47

严格模式概述

除了正常运行模式,ECMAscript 5添加了一种特殊的执行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。

严格模式是一种将更好的错误检查引入代码中的方法,它修复了部分语言上的不足,并增强安全性,提高编码器效率。在使用严格模式时,不能赋值给未声明变量等。本文将详解严格模式的声明以及严格模式与普通模式的区别。

进入严格模式的方法

可以通过在文件、程序或函数的开头添加 "use strict"; 来声明严格模式,此类声明称作“指令序言”。严格模式声明方式有两种。如果在全局上下文(函数的范围之外)中声明严格模式,则程序中的所有代码都处于严格模式。如果在函数中声明严格模式,则函数中的所有代码都处于严格模式。例如,在以下示例中,所有代码都处于严格模式,并且函数外部的变量声明会导致出现语法错误“严格模式下未定义变量”。

1.针对整个文件

'use strict';function func(){
}
我们可以在整个js文件的开头声明“use strict”,这样的话,整个js文件的所有代码都在严格模式下执行。但是,在此处有一个小坑,实际上,这个“use strict”不一定要是文件的第一行代码,在“'use strict'”的前面,我们也可以用单引号引起来一个'abc'或者是其他的指令,只要前面不是产生实际运行结果的语句(如var a),这样的“use strict”写在第二行也是可以的。

2.针对某个函数

function func(){
    'use strict';
}
如果要让这个函数func中所有的代码都在严格模式下执行,那么我们可以在开头用一个字符串“use strict”这样一个指令,这样写有一个好处是向上兼容,比如说某个浏览器(如老版本的IE)不支持严格模式,那么它只会被当做一个普通字符串并被忽略掉。

严格模式与普通模式的区别

 1. 不允许用with。

 2. 不允许未声明的变量被赋值,全局变量必须显式声明。

 3. eval中的代码不能创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,并在eval返回时丢弃。

 4. 函数中的特殊对象arguments变为参数的静态副本,参数传还是不传,都不会和arguments相互影响,不像普通模式那样,修改arguments或修改参数变量会相互影响。但是,如果传入的参数是对象,由于javaScript中是按照共享传递的,所以修改对象的属性仍然会和arguments相互影响。

 5.严格模式下delete参数或者函数名会报错,而普通模式下只是返回false。

 6. 删除configurable=false的属性时报错,而不是忽略。

 7. 禁止八进制字面量,如010(八进制的8)。

 8. 严格模式下eval、arguments变为关键字,不能用作变量名。

 9. 一般函数调用时(不是对象的方法调用,也不使用apply/call/bind等修改this)this指向null,而不是全局变量。

10. 试图修改不可写属性(writable=false),在不可扩展的对象上添加属性时报TypeError,而不是忽略。

11. arguments.caller,arguements.callee被禁用



0 0
原创粉丝点击