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 做好铺垫。
目的呢,了解即可,毕竟一般情况用的真的不多。
严格模式中的一些变化
不允许使用未申明的变量;
for(i = 0; i < 2; i++) { // 此处报错:Uncaught ReferenceError: i is not defined
}
b=123;//报错;
不允许删除变量和函数
在严格模式下,删除变量或函数,则会报错: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;
函数中不允许有同名的参数。
"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
通过验证的几个,可以知道全部按照最后一位参数进行计算的!!
当然,实际项目中,不可能哪个人参数弄一样的,给你一个大比兜。
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 语句内使用。
不允许使用 with 语句。
with语句???对不起,我又懵了!各位想必一样吧,毕竟这玩意真的不多用,很冷门的东西。可能会在无意中污染作用域,而且在复杂情形中,关于作用域的出错会变得很麻烦。在严格模式中,禁止使用with方法。
不允许对只读属性赋值。
"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未定义
总的来说,了解即可,又没说让你一次写完,永不出错。配合着报错,外加了解其中的缘由,相信当哪天使用严格模式的时候也会快速发现问题。