246 JavaScript严格模式

3.1 什么是严格模式

JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)。

ES5 的严格模式是采用具有限制性 JavaScript变体的一种方式,即在严格的条件下运行 JS 代码。

严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。

严格模式对正常的 JavaScript 语义做了一些更改:

1.消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为。

2.消除代码运行的一些不安全之处,保证代码运行的安全。

3.提高编译器效率,增加运行速度。

4.禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比如一些保留字如:class,enum,export, extends, import, super 不能做变量名


3.2 开启严格模式

严格模式可以应用到整个脚本或个别函数中。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况。


  • 情况一 : 为脚本开启严格模式

    • 有的 script 脚本是严格模式,有的 script 脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他
      script 脚本文件。

      (function (){
        //在当前的这个自调用函数中有开启严格模式,当前函数之外还是普通模式
          "use strict";
             var num = 10;
          function fn() {}
      })();
      
      //或者
      <script>
         "use strict"; //当前script标签开启了严格模式
      </script>
      
      <script>
                  //当前script标签未开启严格模式
      </script>

  • 情况二: 为函数开启严格模式
    • 要给某个函数开启严格模式,需要把“use strict”; (或 ‘use strict‘; ) 声明放在函数体所有语句之前。

      function fn(){
        "use strict";
        return "123";
      }
      //当前fn函数开启了严格模式

3.3 严格模式中的变化

严格模式对 Javascript 的语法和行为,都做了一些改变。

1、变量规定

① 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用 var 命令声明,然后再使用。

② 严禁删除已经声明变量。例如,delete x; 语法是错误的。



2、严格模式下 this 指向问题

① 以前在全局作用域函数中的 this 指向 window 对象。
② 严格模式下全局作用域中函数中的 this 是 undefined。
③ 以前构造函数时不加 new也可以 调用,当普通函数,this 指向全局对象
④ 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
⑤ new 实例化的构造函数指向创建的对象实例。
⑥ 定时器 this 还是指向 window 。
⑦ 事件、对象还是指向调用者。



3、函数变化

① 函数不能有重名的参数。

② 函数必须声明在顶层.新版本的 JavaScript 会引入“块级作用域”( ES6 中已引入)。为了与新版本接轨, 不允许在非函数的代码块内声明函数


'use strict'
num = 10
console.log(num)//严格模式后使用未声明的变量

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

var num2 = 1;
delete num2;//严格模式不允许删除变量

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

function fn() {
 console.log(this); // 严格模式下全局作用域中,函数中的 this 是 undefined 【一般情况下是指向window的,严格模式下他找不到指向的对象,自然指向的就是undefined。】
}
fn();  

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

function Star() {
     this.sex = '男';
}
// Star();严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给它赋值,则会报错.
var ldh = new Star();
console.log(ldh.sex);

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

setTimeout(function() {
  console.log(this); //严格模式下,定时器 this 还是指向 window
}, 2000);  

更多严格模式要求参考

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        'use strict';
        // 1. 我们的变量名必须先声明再使用
        // num = 10;
        // console.log(num);
        var num = 10;
        console.log(num);

        // 2.我们不能随意删除已经声明好的变量 【var、let以及const创建的不可设置的属性不能被delete操作删除。任何使用var声明的变量都会被标记为不可设置的。任何使用 var 声明的属性不能从全局作用域或函数的作用域中删除。任何用let或const声明的属性不能够从它被声明的作用域中删除。】
        delete num;

        // 3. 严格模式下全局作用域中函数中的 this 是 undefined。【一般情况下是指向window的,严格模式下他找不到指向的对象,自然指向的就是undefined。】
        function fn() {
            console.log(this); // undefined。
        }
        fn();

        // 4. 严格模式下, 如果构造函数不加new调用, this 指向的是undefined,如果给它赋值,则报错. 【如果给this添加属性并赋值,则报错。】
        function Star() {
            this.sex = '男';
        }
        // Star();
        var ldh = new Star();
        console.log(ldh.sex);

        // 5. 定时器 this 还是指向 window
        setTimeout(function() {
            console.log(this);
        }, 2000);

        // 6. 严格模式下函数里面的参数不允许有重名
        function fn(a, a) { // a = 1; a = 2;
            console.log(a + a);
        };
        fn(1, 2);
        function fn() {}
    </script>
</body>

</html>

原文地址:https://www.cnblogs.com/jianjie/p/12231026.html

时间: 2024-08-01 00:38:06

246 JavaScript严格模式的相关文章

Javascript 严格模式详解

Javascript 严格模式详解 作者: 阮一峰 日期: 2013年1月14日 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度

Javascript原型模式总结梳理

在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编程语言中,类并不是必需的,对象不一定需要由类实例化而来,而是通过克隆另外一个对象来得到. 原型模式是用来创建对象的一种模式.在以类为中心的语言中,要创建一个对象首先要指定这个对象的类型,然后实例化一个对象.使用原型模式创建对象时不必关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样

javascript单体模式

单体模式的思想在于保证一个特定类仅有一个实例.这意味着当第二次使用同一个类创建的新对象的时候,应该得到与第一个所创建的对象完全相同. javacript中并没有类,因此对单体咬文嚼字的定义严格来说并没有意义.但是javascript具有new语法可使用构造函数来创建对象,而且有时需要使用这种语法的单体实现.这种思想在于当使用同一个构造函数以new操作符来创建多个对象时,应该仅获得指向完全相同的对象的新指针. 下面的代码显示了其预期行为: var nui = new Universe(); var

JavaScript 严格模式

! function () { var /* */testA = function () { ; console.log( this ) } , testB = function () { "use strict" ; console.log( this ) } ; testA() // 输出window ; testB() // 输出undefined 严格模式下 this 不能指向全局 ; testA.call('test') // 转换成包装类型 ; testB.call('te

Javascript Module 模式

Javascript Module Pattern 可以说是在Javascript代码实现过程中的最佳实践方法,能够清晰地表达Javascript面向对象的概念.其核心理念是用Javascript的“类”封装私有和公有的属性和方法.它不允许开发人员定义全局变量去“污染”全局对象.通过这种模式,可以提高Web的性能,也利于维护Javascript的代码. 在Javascript程序设计语言中,函数可以作为一个模块,在某些情况下,需要创建的是单例对象,而不是创建一个类的实例.在模块的内部,公共接口可

Javascript编程模式(JavaScript Programming Patterns)Part 1.

JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript libraries变得越来越流行. 如果你面对着很多的工作计划,一个很明确的道理就是在网站变得越来越复杂的情况下每次修改‘轮子“肯定让你不爽.当然我们把类库放到一边,聚焦于 JavaScript的语法,对你最有价值的东西是在你编写 JavaScript你要明确你使用的是那种”编程模式“. 下面主要介绍几个jav

JQuery日记6.5 Javascript异步模式(一)

理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最easy想到的异步方式就是在当前线程中,新创建一个线程让某段代码片段执行在新创建的线程中,从而使当前线程继续向下进行. 而不论什么一本书关于js的书都会告诉我们js是执行在单线程里的,这个线程称为UI线程,从名字就知道这个线程不光用于执行js代码,还负责事件的处理和UI的绘制. 在游览器内部维护着一

JavaScript严格模式为何要禁用With语句

看了很多遍JavaScript严格模式,其中有说“禁用With语句”,以前看到这都是骑马观花,一带而过,因为平时就很少用到这个语句,禁不禁用对自己关系都不是很大.今天禁不住想知道为何“严格模式”就容不下with语句呢? EcmaScript规范上说“with 语句用于设置代码在特定对象中的作用域”,可以看出,With语句改变了作用域链. 1 function Person(name,age,sex){ 2 this.name = name; 3 this.age = age; 4 this.se

Javascript 严格模式(strict mode)详解

Javascript 严格模式详解 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度: - 为未来新版本的Javascript做好