您好,登录后才能下订单哦!
好程序员 web前端教程之 详解JavaScript严格模式 , 严格模式 (Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,发布于2009年12月第五版。旨在改善错误检查功能并且标识可能不会延续到未来JavaScript版本的脚本。ES5严格模式是限制性更强的JavaScript变体,它与常规JavaScript的语义不同,其分析更为严格。
目前,除了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)。
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()
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。