js严格模式

严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准

一、严格模式的使用

严格模式 的使用很简单,只有在代码首部加入字符串 “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 = 10
eval('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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值