深入理解javascript严格模式(Strict Mode)

深入理解JavaScript严格模式

JavaScript严格模式(Strict Mode)是ECMAScript 5引入了一种新的执行模式,主要用于消除JavaScript语言的一些不合理、不严谨之处,减少一些怪异行为。

启用严格模式

全局启用严格模式

要想在全局范围启用严格模式,需要在JavaScript源码文件的顶部添加如下代码:

"use strict";

整个源码文件都会进入严格模式,包括该文件导入的所有模块也会进入严格模式。

局部启用严格模式

对于某个JS函数或某个代码块,也可以开启独立的严格模式。需要在函数或代码块的开头添加如下代码:

function strictModeExample1() {
  "use strict";
  // 代码块
}
(function(){
  "use strict";
  // 代码块
})();

严格模式带来的变化

1. 变量必须先声明,再使用

在非严格模式下,如果直接使用未经声明的变量,JavaScript会隐式地将其创建为一个全局变量,导致在某些情况下出现意外的变量名冲突。严格模式下,如果直接使用未经声明的变量,JavaScript直接抛出一个引用错误(ReferenceError)。

function strictModeExample2() {
  "use strict";
  var a = 1;
  b = 2; // 直接使用未经声明的变量,在严格模式下,JavaScript抛出一个ReferenceError错误。
  console.log(a, b);
}
strictModeExample2(); // 引用错误:b is not defined

2. 对象字面量中定义的重复属性会报错

在非严格模式下,如果一个对象字面量中定义了多个同名属性,则只会保留最后一个属性的值,其它属性都被忽略。在严格模式下,如果一个对象字面量中定义了多个同名属性,JavaScript会抛出一个语法错误(SyntaxError)。

function strictModeExample3() {
  "use strict";
  var data = {
    name: 'Lucy',
    email: 'lucy@example.com',
    name: 'Lily' // 对象字面量中定义的重复属性,在严格模式下,JavaScript会抛出一个SyntaxError错误。
  };
  console.log(data);
}
strictModeExample3(); // 语法错误:Duplicate data property in object literal not allowed in strict mode

3. eval函数不会在其所在的作用域中作为本地变量绑定

非严格模式下,eval函数所执行的代码字符串中声明的变量会被添加到eval函数所在的作用域中。在严格模式下,eval函数不会在其所在的作用域中作为一个本地变量绑定,而是在一个新的、私有的作用域中执行,这意味着eval函数不能读写执行环境中的本地变量。

function strictModeExample4() {
  "use strict";
  eval('var foo = 1');
  console.log(foo); // 严格模式下,变量foo不会添加到当前作用域中,JavaScript会抛出一个引用错误。
}
strictModeExample4(); // 引用错误:foo is not defined

4. 函数的参数名不能重复

在非严格模式下,如果两个参数的名称相同,JavaScript会默认忽略第二个参数的定义,这可能导致意料之外的行为。在严格模式下,如果两个参数名称相同,JavaScript会抛出一个语法错误(SyntaxError)。

function strictModeExample5(arg1, arg1) { // 在函数参数中定义的重复变量名称,在严格模式下,JavaScript会抛出一个SyntaxError错误。
  "use strict";
  console.log(arg1, arg1);
}
strictModeExample5(1, 2); // 语法错误:Duplicate parameter name not allowed in strict mode

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

在非严格模式下,如果一个函数在全局上下文中调用,函数内部的this关键字会被绑定到全局对象上。在严格模式下,如果一个函数在全局上下文中调用,函数内部的this关键字会被绑定到undefined。

function strictModeExample6() {
  "use strict";
  console.log(this); // 在全局作用域中调用函数,严格模式下,函数内部的this关键字会被绑定到undefined。
}
strictModeExample6.call(null); // 输出:undefined

6. 运行eval或Function代码时,不会在其所在的外层作用域中创建新的变量或函数

在非严格模式下,eval或Function代码所在的作用域可以动态地创建新的变量或函数,这可能导致应用程序安全性方面的隐患。在严格模式下,eval或Function代码执行时,不会在其所在的外层作用域中创建新的变量或函数。

function strictModeExample7() {
  "use strict";
  var data = '0000';
  eval('var data = "1111"');
  console.log(data); // 在非严格模式下,data变量的作用域被改变,输出结果为1111。但在严格模式下,eval代码不会在其外层作用域中创建新的变量,输出结果仍为0000。
}
strictModeExample7(); // 输出:0000

示例

示例1:禁止使用with语句

严格模式下禁止使用with语句,因为该语句会增加程序的安全隐患,且容易出现引用错误。

function strictExample1() {
  "use strict";
  var myObject = {foo: 'bar'};
  with(myObject) { // 严格模式下,使用with语句会抛出一个语法错误
    console.log(foo);
  }
}
strictExample1(); // 抛出语法错误:Strict mode code may not include a with statement

示例2:禁止在非函数代码块内声明函数

在非严格模式下,在if或for语句块中声明的函数会被提升到当前作用域的顶部,可能会覆盖同名的函数或变量。严格模式下,如果在非函数代码块内声明函数,JavaScript会抛出一个语法错误。

function strictExample2() {
  "use strict";
  if(true) {
    function myFunction() { // 在严格模式下,函数不能在非函数代码快中定义。这里会抛出一个语法错误
      console.log('Hello, Strict Mode!');
    }
    myFunction();
  }
}
strictExample2(); // 抛出语法错误:In strict mode code, functions can only be declared at top level or inside a block.

结论

通过严格模式,JavaScript增加了许多新特性,去除了大量的不规范、不守规矩的操作,帮助开发者编写更加简洁、高效、可靠的代码。在能够掌握严格模式的基础上,开发者可以避免一些常见的JavaScript陷阱,提高代码的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解javascript严格模式(Strict Mode) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JavaScript获取客户端IP的方法(新方法)

    JavaScript获取客户端IP的方法(新方法)攻略 在Web开发中,有时候需要获取客户端IP地址以便进行位置定位、用户分析等用途。本攻略将详细讲解使用JavaScript获取客户端IP的方法。 一、使用第三方服务API 我们可以通过调用第三方服务API的方式获取客户端IP地址。其中比较常用的是 ipify,它提供了简单易用、速度快、支持IPv6等特点。 …

    JavaScript 2023年5月27日
    00
  • JavaScript中原型和原型链详解

    原型和原型链是 JavaScript 中非常重要的概念,理解它们对于学习和使用 JavaScript 语言是至关重要的。下面将为大家详细讲解 JavaScript 中原型和原型链的概念。 什么是原型 在 JavaScript 中,每个对象都有一个原型,原型本质上是一个对象。对象通过原型继承属性和方法。每个新对象都隐式地引用了其构造函数的原型作为其内部对象。可…

    JavaScript 2023年6月10日
    00
  • JavaScript实现表单验证示例

    下面是针对“JavaScript实现表单验证示例”的完整攻略: 1. 表单验证的基本思路 前端表单验证的基本思路是,当用户提交表单时,先阻止表单的默认提交行为,然后通过JavaScript对表单进行内容的检测和验证,如果发现问题,则提示用户并阻止表单的提交。否则,允许表单进行提交操作。 通常,表单验证的实现流程如下: 针对表单的提交事件进行监听; 在提交事件…

    JavaScript 2023年6月10日
    00
  • javascript对象的相关操作小结

    JavaScript对象的相关操作小结 1. JavaScript对象介绍 JavaScript对象是一种复合数据类型,可以用于存储同一类型的数据。 2. 创建JavaScript对象的三种方式 JavaScript对象可以通过字面量、构造函数和Object.create()创建。 2.1 字面量创建对象 示例代码: var obj = { name: &q…

    JavaScript 2023年5月27日
    00
  • js 把字符串当函数执行的方法

    将字符串当函数执行是 JavaScript 中一种常见的技巧,可以用来动态地执行函数,也可以用来解析表达式。下面是使用字符串将一个函数执行的示例: 假设我们有如下的函数: function sayHello(name) { console.log("Hello, " + name + "!"); } 我们可以将该函数的…

    JavaScript 2023年5月27日
    00
  • javascript学习笔记(十) js对象 继承

    下面是“javascript学习笔记(十) js对象 继承”的攻略。 一、对象的基础知识 在JavaScript中,对象是一种键-值对的数据结构。而对象的键和值通常称作属性和方法。我们可以使用对象字面量定义一个简单的对象,如下所示: var person = { name: ‘Jack’, age: 20, sayHi: function() { conso…

    JavaScript 2023年5月27日
    00
  • JavaScript数组reduce常见实例方法

    下面是关于JavaScript数组reduce方法的一些详细讲解和两个示例说明。 什么是reduce方法 reduce 是 JavaScript 数组中的一个高阶函数,作用是将数组中的所有元素通过指定函数进行归纳,最终返回一个单一的值。这个指定函数接收两个参数:累加器和当前值。 reduce 语法: array.reduce(function(accumul…

    JavaScript 2023年5月27日
    00
  • Web Uploader文件上传插件使用详解

    Web Uploader文件上传插件使用攻略 Web Uploader是一款基于HTML5的文件上传插件,可以通过它来实现文件上传功能。下面将介绍Web Uploader的使用方法和相关示例。 一、环境准备 首先,需要在web页面中引入Web Uploader的相关js和css文件,以及Jquery库。可以通过CDN引入,也可以下载到本地使用。 <li…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部