我是靠谱客的博主 忐忑小笼包,最近开发中收集的这篇文章主要介绍JavaScript严格模式限制整理变量必须声明后再使用函数的参数不能同名,否则报错不能使用with语句不能对只读属性赋值和删除不可删除的属性,否则报错不能使用前缀 0 表示八进制数,否则报错不能删除变量,否则会报错外层作用域不能使用eval内声明的变量禁止this指向全局对象不能使用arguments.callee,arguments.callee和arguments.callereval和arguments不能被重新赋值增加了保留字,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JavaScript中通过在全局或函数的开头写上"use strict"使用严格模式,而严格模式下的JavaScript会有些许限制。

变量必须声明后再使用


在严格模式中,变量未经声明使用不再变为全局变量,而是会报错

function strictFn(){
    "use strict";
    a=2;
}

strictFn();
// Uncaught ReferenceError: a is not defined at strictFn

但是在严格模式下还是有变量提升

function strictFn(){
    'use strict';
    a=2;
	var a;
}

strictFn();

函数的参数不能同名,否则报错


function fn(a,a){
    "use strict";
}
// Uncaught SyntaxError: Duplicate parameter name not allowed in this context

function fn(a,a){
}
// undefined

不能使用with语句


with语句在给对象属性赋值时很方便,但会在运行时修改或创建新的作用域,在严格模式下with语句被彻底禁止了。

var obj={
    a:1
}
function strictFn(obj){
    "use strict";
    with(obj){
        a=2;
    }
}
// Uncaught SyntaxError: Strict mode code may not include a with statement

这里可以看到严格模式下甚至没有调用严格模式下的函数,仅声明时就已经报错了。

不能对只读属性赋值和删除不可删除的属性,否则报错


在非严格模式下修个只读属性和删除不可删除的属性,只会静默失败,而在严格模式下则会报错

var person={};
Object.defineProperty(person,"age",{
    value:20,
    writable:false,
    configurable:false
});

// 非严格模式
function normalFn(obj){
    obj.age=21;
}
normalFn(person);
person.age;
// 20

function normalFn(obj){
    delete obj.age;
}
normalFn(person);
person.age;
// 20

//严格模式
function strictFn(obj){
    "use strict";
    obj.age=21;
}
strictFn(person);
// Uncaught TypeError: Cannot assign to read only property 'age' of object '#<Object>' at strictFn

function strictFn(obj){
	"use strict";
    delete obj.age;
}
strictFn(person);
// Uncaught TypeError: Cannot delete property 'age' of #<Object> at strictFn

不能使用前缀 0 表示八进制数,否则报错


在非严格模式下,可以使用前缀0表示八进制,而在严格模式下会报错。但是使用0o前缀表示八进制不会报错。

// 非严格模式
function normalFn(){
    console.log(011);
}
normalFn();
// 9

//严格模式
function normalFn(){
    "use strict";
    console.log(011);
}
// Uncaught SyntaxError: Octal literals are not allowed in strict mode.
// 声明时就报错

function strictFn(){
	"use strict";
    console.log(0o11);
}
strictFn()
// 9

不能删除变量,否则会报错


// 非严格模式
function normalFn(){
    var prop;
    delete prop;
}
normalFn();

// 严格模式
function strictFn(){
    "use strict";
    var prop;
    delete prop;
}
strictFn();
// Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

外层作用域不能使用eval内声明的变量


在严格模式中,eval在运行时有自己的词法作用域,这使得其中的声明无法修改其所在的作用域

//非严格模式
function normalFn(){
    eval("var a=1");
    console.log(a);
}
normalFn();
// 1

// 严格模式
function strictFn(){
    "use strict";
    eval("var a=1");
    console.log(a);
}
strictFn();
// Uncaught ReferenceError: a is not defined at fn

在严格模式下,可以避免eval修改当前作用域中的变量

function fn(){
    "use strict";
	var a=1;
    eval("var a=2;console.log('eval:'+a)");
    console.log("out:"+a);
}
fn();
// eval:2
// out:1

上面代码中,在eval中使用了自己作用域中的变量a,而外部函数作用域中的变量a的值没有被改变

禁止this指向全局对象


在非严格模式中,使用call传入null作为第一个参数会使this指向全局对象,而在严格模式中会报错

var a=1;
function fn(){
	"use strict";
    console.log(this.a);
}
fn.call(null);
// Uncaught TypeError: Cannot read property 'a' of null at fn

不能使用arguments.callee,arguments.callee和arguments.caller


"use strict";
function fn(){
	console.log(fn.caller);
}
fn();
// Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them at fn

eval和arguments不能被重新赋值


function fn(){
	"use strict";
    var eval=1;
    console.log(eval);
}
// Uncaught SyntaxError: Unexpected eval or arguments in strict mode

增加了保留字


为了向后面的JavaScript过渡,严格模式下增加了一些保留字,implements, interface, let, package, private, protected, public, static, yield,class, enum, export, extends, import, super等,使用这些保留字作为变量名会报错

function fn(){
    "use strict";
    var class=1;
}
// Uncaught SyntaxError: Unexpected token class

若有所缺漏和错误,请各位大佬帮忙指出

最后

以上就是忐忑小笼包为你收集整理的JavaScript严格模式限制整理变量必须声明后再使用函数的参数不能同名,否则报错不能使用with语句不能对只读属性赋值和删除不可删除的属性,否则报错不能使用前缀 0 表示八进制数,否则报错不能删除变量,否则会报错外层作用域不能使用eval内声明的变量禁止this指向全局对象不能使用arguments.callee,arguments.callee和arguments.callereval和arguments不能被重新赋值增加了保留字的全部内容,希望文章能够帮你解决JavaScript严格模式限制整理变量必须声明后再使用函数的参数不能同名,否则报错不能使用with语句不能对只读属性赋值和删除不可删除的属性,否则报错不能使用前缀 0 表示八进制数,否则报错不能删除变量,否则会报错外层作用域不能使用eval内声明的变量禁止this指向全局对象不能使用arguments.callee,arguments.callee和arguments.callereval和arguments不能被重新赋值增加了保留字所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部