JS严格模式(use strict)

javascript语法不够严谨,例如我们在项目中不用关键字去定义了一个变量a,控制台一切正常。

 b=123;
 console.log(b)

但是,如果开启了严格模式呢?

"use strict"
b=123;
console.log(b)

此时将会报错Uncaught ReferenceError: b is not defined

补充:开启严格模式就是加上"use strict",指令只有在整个脚本第一行或者函数第一行时才能被识别,除了 IE9 以及更低的版本外,所有的浏览器都支持该指令。

严格模式下对语法要求比较高,添加严格模式,主要有以下几个目的:

  • 消除 JavaScript 语法中一些不合理、不严谨的地方;

  • 消除代码中一些不安全的地方,保证代码的安全运行;

  • 提高 JavaScript 程序的运行效率;

  • 为以后新版本的 JavaScript 做好铺垫。

目的呢,了解即可,毕竟一般情况用的真的不多。

严格模式中的一些变化

  1. 不允许使用未申明的变量;

for(i = 0; i < 2; i++) { // 此处报错:Uncaught ReferenceError: i is not defined
}
b=123;//报错;
  1. 不允许删除变量和函数

在严格模式下,删除变量或函数,则会报错:Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

"use strict"
var b={name:'hahah',age:'90'};
delete b
function sum(a, b) {
    return a + b;
}
delete sum;
  1. 函数中不允许有同名的参数。

"use strict"
        
    function fn(a,a){ //报错,Uncaught SyntaxError: Duplicate parameter name not allowed in this context
        return a+a;
    }
     console.log(fn(6,5))

这里补充一点:若是普通状态下的计算结果会是什么呢?

function fn(a,a){
        return a+a;
    }
console.log(fn(6,5))//10

通过验证的几个,可以知道全部按照最后一位参数进行计算的!!

当然,实际项目中,不可能哪个人参数弄一样的,给你一个大比兜。

  1. eval 语句的作用域是独立的。

不知道你是不是和我一样,见到eval方法瞬间懵了,还有这玩意????

语法:eval(string);其中string为字符串啊!!!!

eval() 函数计算或执行参数。如果参数是表达式,则 eval() 计算表达式。如果参数是一个或多个 JavaScript 语句,则 eval() 执行这些语句。

我们普通模式下,是这样的:

eval("var x = '18';")
console.log(x) //18

🆗,可以看出完全没问题,但是加了严格模式呢?是这样的:

"use strict"
eval("var x = '18';")
console.log(x)//Uncaught ReferenceError: x is not defined

可以看出,在严格模式下,eval 语句本身就是一个局部作用域,通过 eval 语句生成的变量只能在 eval 语句内使用。

  1. 不允许使用 with 语句。

with语句???对不起,我又懵了!各位想必一样吧,毕竟这玩意真的不多用,很冷门的东西。可能会在无意中污染作用域,而且在复杂情形中,关于作用域的出错会变得很麻烦。在严格模式中,禁止使用with方法。

  1. 不允许对只读属性赋值。

"use strict"
    var obj = {}
    Object.defineProperty(obj,'name',{value:'java',writable:false})
    obj.name='go' // Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'

7.不允许使用八进制数

"use strict"
var x = 010;
console.log(x)//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

8.在if语句外调用在 if 语句中定义的函数时,会提示函数未定义。

"use strict"
    if (true) {
        function demo() { // 此处报错:Uncaught ReferenceError: demo is not defined
            console.log("11111");
        }
    }
    demo()

9.不允许删除一个不允许删除的属性:

"use strict"
    delete Object.prototype;//Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
    console.log(Object)//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

10.不允许对一个使用getter方法读取的属性进行赋值

"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;  // 报错Uncaught TypeError: Cannot set property x of #<Object> which has only a getter

11.不允许使用转义字符。

"use strict";
var x = \010;            // 报错

12.禁止this关键字指向全局对象。

function f(){
    return !this;
} 
// 返回false,因为"this"指向全局对象,"!this"就是false

function f(){ 
    "use strict";
    return !this;
} 
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

function f(){
    "use strict";
    this.a = 1;
};
f();// 报错,this未定义

总的来说,了解即可,又没说让你一次写完,永不出错。配合着报错,外加了解其中的缘由,相信当哪天使用严格模式的时候也会快速发现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值