什么是js的严格模式

 设立严格模式的原因:

  - 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

  - 消除代码运行的一些不安全之处,保证代码运行的安全;

  - 提高编译器效率,增加运行速度;

  - 为未来新版本的Javascript做好铺垫。

"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,IE 10在内的主流浏览器

"use strict";//是进入严格模式的标志(老版本的浏览器会把它当作一行普通字符串,加以忽略。)

将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。

针对原文这样的描述,我已做过尝试,例如:

    <script type="text/javascript">;'use strict';a=1;console.log(a)//1</script>
    <script type="text/javascript">;'use strict';a=1;console.log(a)//1</script>
    <script type="text/javascript">'use strict';a=1;//报错console.log(a)</script>

以上的三种情况的测试,所以我暂且认为 ‘use strict’  是一定要放在第一行的。且前面不能有其他代码。

一如何调用

1.1、针对整个脚本文件

 <script>"use strict";console.log("这是严格模式。");</script><script>console.log("这是正常模式。");</script>

 1.2、针对单个函数

将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行。

 function strict(){"use strict";return "这是严格模式。";}function notStrict() {return "这是正常模式。";}

1.3、脚本文件的变通写法

因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。

        <script type="text/javascript">    (function(){'use strict';function strict(){a=1;console.log(a)}strict();function notStrict() {var a=1;console.log(a)}notStrict();})()</script>

 

二语法和行为的改变

2.1、全局变量显式声明

严格模式,在严格模式下,变量必须先用var声明,然后再使用  

            'use strict';a=2;console.log(a)//报错for(i=0;i<5;i++){  //报错
                console.log(i)}

正常模式

            a=2;console.log(a)//2for(i=0;i<5;i++){console.log(i)//0 1 2 3 4}

 2.2、静态绑定

(1)禁止使用with()语句

(2)创设eval作用域

正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。

正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。

三、增强的安全措施

(1)禁止this关键字指向全局对象

       function fn(){return !this;}console.log(fn())//false  因为"this"指向全局对象,"!this"就是falsefunction fn2(){'use strict'return !this;}console.log(fn2())//true  因为严格模式下,this的值为undefined,所以"!this"为true。function fn3(){'use strict'return this;}console.log(fn3())//undefined    因为严格模式下,this的值为undefined。

 因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。

      function fn(){'use strict'this.a=1;}fn()//报错,this未定义

(2)禁止在函数内部遍历调用栈

    function fn(){"use strict";f1.caller; // 报错f1.arguments; // 报错
          }fn();

四 禁止删除变量

严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。

 

在非严格模式下是如何删除变量的:

(1)对象属性可以删除

            var obj={name:'lili',age:18,sex:'女'}delete obj.name;
           console.log(obj.name)//undefined           console.log(obj)//{age: 18, sex: "女"}

(2)无法直接删除变量

       var a=1;delete a;console.log(a) //1

(3)删除不了原型链中的变量

       function fun(){this.name = 'lili';}var obj = new fun();fun.prototype.age = 18;delete obj.age;console.log(obj.age) //18

 (4)显式报错

正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。

        var o = {};Object.defineProperty(o, "v", { value: 1, writable: false });o.v = 2;console.log(o)//1   虽然没有改变,但是也没有报错
       'use strict';var o = {};Object.defineProperty(o, "v", { value: 1, writable: false });o.v = 2; // 报错console.log(o)

严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。

       var o = {get v() { return 1; }};o.v = 2; console.log(o.v)//1  虽然没有改变,但是没有报错
       'use strict';var o = {get v() { return 1; }};o.v = 2; // 报错console.log(o.v)

严格模式下,对禁止扩展的对象添加新属性,会报错。

        var o = {};Object.preventExtensions(o);o.v = 1;console.log(o)//空对象
       'use strict';var o = {};Object.preventExtensions(o);o.v = 1; //
            console.log(o)

严格模式下,删除一个不可删除的属性,会报错。

 delete Object.prototype; //无影响
'use strict';
delete Object.prototype; // 报错

(5)重名错误

5.1对象不能有重名的属性

原文档如此表述,但经过我测试,只有在IE10和IE11的时候,才会报错( strict 模式下不允许一个属性有多个定义),基本上常规浏览器就是最后赋值

的属性覆盖掉前面的属性。

5.2 函数不能有重名的参数

正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。

  function f(a, a, b) { return a;}f();
       "use strict";function f(a, a, b) { // 语法错误return a;}f();

(6)禁止八进制表示法

正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。

 "use strict";var n = 0100; // 语法错误

(7) arguments对象的限制

arguments是函数的参数对象,严格模式对它的使用做了限制。

1 不允许对arguments赋值

  "use strict";

  arguments++; // 语法错误

  var obj = { set p(arguments) { } }; // 语法错误

  try { } catch (arguments) { } // 语法错误

  function arguments() { } // 语法错误

  var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误

2 arguments不再追踪参数的变化

  function f(a) {

    a = 2;

    return [a, arguments[0]];

  }

  f(1); // 正常模式为[2,2]

  function f(a) {

    "use strict";

    a = 2;

    return [a, arguments[0]];

  }

  f(1); // 严格模式为[2,1]

3 禁止使用arguments.callee

这意味着,你无法在匿名函数内部调用自身了。

  "use strict";

  var f = function() { return arguments.callee; };

  f(); // 报错

(8) 函数必须声明在顶层

将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

  "use strict";

  if (true) {

    function f() { } // 语法错误

  }

  for (var i = 0; i < 5; i++) {

    function f2() { } // 语法错误

  }

(9) 保留字

为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。

使用这些词作为变量名将会报错。

  function package(protected) { // 语法错误

    "use strict";

    var implements; // 语法错误

  }

此外,ECMAscript第五版本身还规定了另一些保留字(class, enum, export, extends, import, super),以及各大浏览器自行增加的const保留字,也是不能作为变量名的。

 

 

 

 

 

 

参考:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

转载于:https://www.cnblogs.com/xumqfaith/p/7841338.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动设计ioctl函数的cmd参数不能为2

Linux驱动程序设计的时候偶然发现的ioctl()函数的cmd参数不能为2&#xff0c;如果为2,ioctl()函数返回-1&#xff0c;网上说就是这样的&#xff0c;正常&#xff0c;不知道为什么&#xff0c;stack overflow上有一个外国学友的建议&#xff1a; “In general, you want to comp…

代码解说Android Scroller、VelocityTracker

在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker。Android Touch系统简单介绍&#xff08;二&#xff09;:实例具体解释onInterceptTouchEvent与onTouchEvent的调用过程对Android触摸机制须要用到的函数进行了具体的解释。本文主要介绍两个重要…

Effective_STL 学习笔记(四十四) 尽量使用成员函数代替同名的算法

有些容器拥有和 STL 算法同名的成员函数。 关联容器提供了 count、find、lower_bound、upper_bound 和 euqal_range list 提供了 remove、remove_if、unique、merge 和 reverse 大多数时候应该用成员函数代替手写算法&#xff0c;这样做的两个理由&#xff1a; 比起算法&#x…

(NFS移植到arm上)编译portmap和nfs-utils

为了在播放机上实现NFS服务器的功能&#xff0c;我们已经在uClibc中打开了完整RPC支持&#xff0c;并且在新编译的内核中打开了NFS服务器支持。此外还有两个软件包也是提供NFS服务所必需的&#xff1a;portmap和nfs-utils。portmap为RPC程序提供端口映射服务&#xff0c;nfs-ut…

HTML5上传预览

http://cobain-li.iteye.com/blog/2296538转载于:https://www.cnblogs.com/winyh/p/7850049.html

支付宝支付

1 申请商户平台 2 申请开放平台 3 申请APP支付 4 创建应用 (名称&#xff0c;logo) 5 生成RSA秘钥&#xff08;公钥&#xff0c;私钥&#xff09; 6 在应用中配置公钥 7 配置其他内容&#xff0c;包括iOS bundle ID。配置安卓包名&#xff0c;和签名。 获取appid&#xff0c;公…

HttpRequest Java原生代码封装

HttpRequest Java原生代码封装 get提交 post提交 name1value1&name2value2 的形式 json形式两种形式 package com.beisun.mbp.mbp.controller;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…

Linux 系统目录

/ 根目录 /bin 存放必要的命令 /boot 存放内核以及启动所需的文件等 /dev 存放设备文件 /etc 存放系统的配置文件 /home 用户文件的主目录&#xff0c;用户数据存放在其主目录中 /lib 存放必要的运行库 /mnt 存放临时的映射文件系统&#xff0c;我们常把软驱和光驱挂装在这里的…

linux多线程学习设置线程调度权限

pthread_setschedparam 设置线程的权限 int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param) 参数 1. target_thread是使用pthread_create所获得的线程ID。   2&#xff0e;线程的调度有三种策略&#xff1a;SCHED_OTHER、…

不可错过的CMS学习笔记

引子 带着问题去学习一个东西&#xff0c;才会有目标感&#xff0c;我先把一直以来自己对CMS的一些疑惑罗列了下&#xff0c;希望这篇学习笔记能解决掉这些疑惑&#xff0c;希望也能对你有所帮助。 CMS出现的初衷、背景和目的&#xff1f; CMS的适用场景&#xff1f; CMS的tr…

团队合作及个人成长

通过前一章的学习&#xff0c;我了解到了关于建模的很多初步的知识&#xff0c;但是这和成为一名软件工程师是远远不够的&#xff0c;完成一个程序通常都是一个团队&#xff0c;而这个团队重要的肯定是需要一些流程&#xff0c;这样才能让程序有条不紊的运行着。在这么一个团队…

相机工作原理

轻轻一按&#xff0c;你的相机就把光子转换为了比特。于是一张相片就保存到了你的 iPhone 里。 让我们假设一下你身处室外&#xff0c;环顾四周。三亿里之外&#xff0c;太阳无时无刻不在发射光子。它们需要花上 8 分钟之久才能到达我们舒适的星球。有一些光子撞击到你周围的物…

Android Studio使用心得

说实话 開始接触这个工具 真的认为非常恶心 毕竟大陆被墙 非常多东西用起来不是非常方便 并且Eclipse转到Android Studio还是一个跨度 废话不多说 以下 讲下我遇到的问题 1. 安装的时候&#xff08;Setup Wizard - Download Components&#xff09; 这个要下载非常长时间 甚至…

CentOS用户和用户组的操作

2019独角兽企业重金招聘Python工程师标准>>> CentOS用户和用户组的操作 長得太帥忚四種檌 关注 2018.05.12 16:40* 字数 312 阅读 115评论 0喜欢 0 用户组的操作 1.添加用户组&#xff1a; groupadd 组名2.修改组名 groupmod -n 新组名 原组名删除用户组groupdel 组…

vue webpack配置分析

写在前面&#xff1a;作为 Vue 的使用者我们对于 vue-cli 都很熟悉&#xff0c;但是对它的 webpack 配置我们可能关注甚少&#xff0c;今天我们为大家带来 vue-cli#2.0 的 webpack 配置分析 vue-cli 的简介、安装我们不在这里赘述&#xff0c;对它还不熟悉的同学可以直接访问 v…

Linux用户空间与内核地址空间

Linux 操作系统和驱动程序运行在内核空间&#xff0c;应用程序运行在用户空间&#xff0c;两者不能简单地使用指针传递数据&#xff0c;因为Linux使用的虚拟内存机制&#xff0c;用户空间的数据可能被换出&#xff0c;当内核空间使用用户空间指针时&#xff0c;对应的数据可能不…

关于主键的设计、primary key

主键&#xff1a;用于唯一标识一个表中一行数据。 外键&#xff1a;用于建立两个表之间的关系&#xff0c;A表中有一列是B表中的主键&#xff0c;那么A表中这列的数据就受到B表主键的约束。 那么关于主键应该如何设计呢&#xff0c;这里我说下优缺点&#xff1a; 1.用自动增长字…

浅谈微信smali注入

作者&#xff1a;郭少雷 搞android搞了几年也没搞出个啥牛逼app出来&#xff0c;眼看时下最火的app微信如此火热&#xff0c;实在想搞搞它&#xff0c;索性就想着给它加点东西进去。 以下内容纯属本人个人爱好&#xff0c;仅限个人学习android用途以及对android的深入了解。 首…

从0到1使用Kubernetes系列(四):搭建第一个应用程序

上一篇文章《从0到1使用Kubernetes系列&#xff08;三&#xff09;&#xff1a;使用Ansible安装Kubernetes集群》中&#xff0c;我们搭建了一套Kubernetes集群&#xff0c;接下来将在本文中介绍如何使用Kubernetes部署一个Nginx并通过Pod IP、Service IP、Ingress这三种方式访问…

Embeded linux之移植iptables

一、内核环境&#xff1a; linux-3.4.35 -*- Networking support ---> Networking options ---> [*] Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration ---> <*> IP tables support (required for filtering/masq/NAT)…