JavaScript严格模式与非严格模式区别

小编 2026-06-22 阅读:1034 评论:0
开启严格模式方法\"use strict\";, 如果放在文件开头就是全局开启严格模式, 还可以在函数内声明, 这么做的话就是这个函数开启严格模式. 严格模式下无法再意外创建全局变量。在普通...

开启严格模式方法\"use strict\";, 如果放在文件开头就是全局开启严格模式, 还可以在函数内声明, 这么做的话就是这个函数开启严格模式.

  1. 严格模式下无法再意外创建全局变量。在普通的JavaScript里面给一个拼写错误的变量名赋值会使全局对象新增一个属性。严格模式中意外创建全局变量被抛出错误替代:
\"use strict\";
a = 1; // 报错, 因为找不到a的声明
  1. 在严格模式下, 试图删除不可删除的属性时会抛出异常
\"use strict\";
delete Object.prototype; // 抛出TypeError错误, 如果不是在严格模式会返回false, 不会报错
  1. , 严格模式要求函数的参数名唯一. 在正常模式下, 最后一个重名参数名会掩盖之前的重名参数. 之前的参数仍然可以通过 arguments[i] 来访问, 还不是完全无法访问.
function sum(a, a, c){ // !!! 语法错误
  \"use strict\";
  return a + a + c; // 代码运行到这里会出错 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
}
  1. 严格模式禁止八进制数字语法. ECMAScript并不包含八进制语法, 但所有的浏览器都支持这种以零(0)开头的八进制语法: 0644 === 420 还有 \"\\045\" === \"%\".在ECMAScript 6中支持为一个数字加\"0o\"的前缀来表示八进制数.
var a = 0o10; // ES6: 八进制

------------------

\"use strict\";
var a = 015 + // !!! 语法错误 Uncaught SyntaxError: Octal literals are not allowed in strict mode.
  1. 严格模式禁用 with
  2. 严格模式下的 eval 不再为上层范围(surrounding scope,注:包围eval代码块的范围)引入新变量.
var x = 1;
eval(\"var x = 2\");
console.log(x); // 2


---------------


var x = 1;
eval(\" \'use strict\';  var x = 2\")
console.log(x); // 1
  1. 严格模式禁止删除声明变量.;
\"use strict\";

var x = 1;
delete x; // !!! 语法错误 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. 如果是非严格模式, 返回false
  1. 严格模式下,参数的值不会随 arguments 对象的值的改变而变化. 严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数.
function f(a){
  a = 42;
  console.log(a, arguments[0]);
}
var pair = f(17); // 42 42

----------
function f(a){
  \"use strict\";
  a = 42;
  console.log(a, arguments[0]);
}
var pair = f(17); // 42 17
  1. 不再支持arguments.callee. 正常模式下,arguments.callee 指向当前正在执行的函数.
  2. 在严格模式下通过this传递给一个函数的值不会被强制转换为一个对象。对一个普通的函数来说,this总会是一个对象:不管调用时this它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的this;还是使用undefined或者null调用函数式this代表的全局对象(使用call, apply或者bind方法来指定一个确定的this) 对于一个开启严格模式的函数,指定的this不再被封装为对象,而且如果没有指定this的话它值是undefined;
\"use strict\";
function fun() { return this; }
console.assert(fun() === undefined);
console.assert(fun.call(2) === 2);
console.assert(fun.apply(null) === null);
console.assert(fun.call(undefined) === undefined);
console.assert(fun.bind(true)() === true);

-----------------
function fun() { return this; }
console.log(fun()); // window对象
console.log(fun.call(2)); // Number(2) 封箱的数字2
console.log(fun.apply(null));  // window对象
console.log(fun.call(undefined)); // window对象
console.log(fun.bind(true)()); // Boolean对象 
  1. 在严格模式下,那么fun.caller和fun.arguments都是不可删除的属性而且在存值、取值时都会报错;
function restricted()
{
  \"use strict\";
  restricted.caller;    // 抛出类型错误 Uncaught TypeError: \'caller\', \'callee\', and \'arguments\' properties may not be accessed on strict mode functions or the arguments objects for calls to them
  restricted.arguments; // 抛出类型错误
}
function privilegedInvoker()
{
  return restricted();
}
privilegedInvoker();

------------

function restricted()
{
  restricted.caller;    // 返回privilegedInvoker函数
  restricted.arguments; // 返回arguments
}
function privilegedInvoker()
{
  return restricted();
}
privilegedInvoker();

参考链接
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表