js中有严格模式和非严格模式两种运行环境
-
在开发中,有非严格模式和严格模式2种开发模式
-
在严格模式下,会做更加严格的语法检查,以前在非严格模式下可以使用的一些语句,在严格模式下直接报错或者抛出异常
-
开启严格模式 : "use strict";
-
如果浏览器支持严格模式就会开启严格模式,如果不支持,'use strict'作为一段字符串忽略处理
实现严格模式:只需要在脚本代码中添加上上述关键字即可。 关键字具体说明
- (1) 注意区分大小写,必须全部都是小写的
- (2) 注意空格,整个字符串总共10个字符
- (3) 单引号和双引号无所谓,但是需要有双引号
- (4) 必须写在作用域的最顶部,注意其位置
- (5) 可以加分号,也可以不加,但是必须是一个字符串
//"use strict"; //正确写法
//"use strict" //正确写法 分号可以省略
//'use strict'; //正确写法 可以使用单引号
//"use strict"; //错误写法 必须是10个字符
//"use Strict"; //错误写法 所有的字符都必须小写
**作用范围**
① 函数的顶部(只对当前的函数有效)
② script标签的顶部,只对当前的标签有效,对页面中其他的script无效
代码示例
//位置01 对func01和func02都有效
//"use strict";
function func01() {
//位置02 对func01有效,对func02无效
//"use strict";
a = 10;
console.log(a);
}
function func02() {
//位置03 对func02有效,但对func01无效
//"use strict";
b = 20;
console.log(b);
}
func01();
func02();
# 严格模式使用注意
**常见的几种**
* ① 所有的变量必须使用var 关键字声明
* ② 不能使用delete关键字删除全局变量 ,以前默认删除失败,严格模式下直接报错
* ③ 在对象中不允许有同名的属性
* ④ 函数的参数必须唯一(不能出现同名的参数)
* ⑤ arguments对象的行为不同,在非严格模式下修改形参的值会反映到arguments中,而严格模式下则相对独立
* ⑥ 禁用了argument.callee和caller函数,他们一个引用函数本身,一个引用调用函数
* ⑦ 不能在if语句中声明函数
* ⑧ 禁止使用eval和arguments作为标识符
* ⑨ 修正this的值,在严格模式下,函数this的值始终是指定的值,无论指定的是什么值。
* 10 禁用了with语句
* 11 去掉了JavaScript中的八进制字面量(以0开头的八进制字面量是无效的语法)
① 所有的变量都必须使用var关键字声明
a = 10; //错误的演示
console.log(10);
② 不能使用delete关键字删除全局变量
//在非严格模式下,删除失败(静默失败) 严格模式下直接报错
var a = 10;
delete a;
console.log(a);
③ 在对象中不允许有同名的属性
//在非严格模式下,会使用后面的属性赋值作为最终值,在严格模式下则直接报错
var obj = {
name:"张三",
name:"李四"
}
console.log(obj);
④ 函数的参数必须唯一(不能出现同名的参数)
//在非严格模式下,如果函数在定义的时候,使用了多个同名的参数,则在函数内部形参的实际值为最后一个传入的实参值
//在严格模式下,直接报错
// function func(a,a,a) {
// console.log(a);
// console.log(arguments);
// }
function func(a,b,c) {
console.log(a);
console.log(arguments);
}
func(1,2,3);
arguments对象的行为不同
说明:
(1)严格模式下,在函数内部修改了对象的指向,对arguments的值不会产生影响
(2)在严格模式下,形参的值和arguments的值是相互独立的,在函数内部修改了形参的值对arguments不受影响
(3)在非严格模式下,修改了形参的值,arguments中的数据会跟着改变
//测试引用类型的值作为函数的参数
function funcName(obj) {
console.log(obj);
console.log(arguments[0]);
//在函数内部修改形参的值
obj = {age:20};
console.log(obj);
console.log(arguments[0]);
}
funcName({name:"张三"});
//测试基本类型数据作为函数的参数
function fun(str) {
console.log(str);
console.log(arguments[0]);
str = "hello";
console.log(arguments[0]);
}
fun("hi");
**⑥ 禁用了argument.callee和caller函数**
说明:
* argument.callee是对函数自身的引用
* argument.calller是对调用函数的引用
var num = (function (n) {
if (n ==1)
{
return 1;
}
return arguments.callee(n-1) + n;
})(10);
console.log(num);
**⑦ 不能在if语句中声明函数**
* 如果在if语句中声明函数,则会产生语法错误
if (true)
{
console.log("________");
function demo() {
console.log("呵呵呵呵");
}
demo();
}
**⑧ 禁止使用eval和argument作为标识符**
var eval = "测试的字符串";
console.log(eval);
var arguments = "参数列表";
console.log(arguments);
**⑨ 修正this的值**
* 在严格模式下,函数this的值始终是指定的值,无论指定的是什么值
var name = "测试的name";
function demoTest() {
//在非严格模式下,打印出来的this为全局的对象window
console.log(this); //在严格模式下打印出来的this为undefined
}
demoTest();
**⑩ 禁用了with语句**
var o = {name:"小狐狸",age:20};
with(o)
{
name = "lisi";
age = 48
}
console.log(o);
网友评论