JS笔记 | JS中的strict model(严格模式)

仅做笔记分享,如有错误请高手指出
ECMAscript5中引入了strict model。严格模式下的JS程序需要比非严格模式下的程序更加规范。严格模式对语法做了比较严格的要求,

  1. 变量上的不同
    message = "Hello Word"

    如上,当我们在非严格模式中这样定义一个message时,因为在前面没有使用var关键字,则message相当于是我们声明的一个全局变量。

    但是,在严格模式中,如果我们这样声明变量,则只会抛出ReferenceError;

var color = "red";
delete color;

如上,当我们在非严格模式中对一个变量调用delete操作符时,非严格模式会允许这样的操作,但是会静默失败。

但是,在严格模式中,会抛出ReferenceError;

对于变量名有所限制:
ES5.1的严格模式保留字:implements let private public yield interface package protected static
ES2015implements package protected interface prvate public

  1. 对象上的不同
    (1).对只读属性赋值会抛出TypeError;
    (2).对不可配置对象调用delete操作符会抛出TypeError;
    (3).对不可扩展对象添加属性会抛出TypeError;
    (4).对非严格模式而言,对象的属性名重复不会导致错误,x.name的值为martin。

    在严格模式下,会抛出语法错误。

var x = {
   name = "jack",
   name = "martin"
  }
  1. 函数上的不同

(1).

var x = function(num,num){
   //do something
  }

在非严格模式下,这个函数声明不会抛出错误,但是通过参数名num只能访问第二个参数,想访问第一个参数需要通过arguments对象。

在严格模式下,会抛出语法错误。
(2).在严格模式下,arguments对象的行为也有所不同。

function x(){
   num = "b";
   alert(num);
   alert(arguments[0]);
}
x("a");

非严格模式下,alert(num)// b,alert(arguments[0])//b;(修改参数的值会反应到arguments中)

严格模式下,修改arguments【0】= “b”,alert(num)//b,alert(arguments[0])// a;(修改参数的值不会反应到arguments中,两者独立)
(3).淘汰了arguments.calleearguments.caller
(4).对函数名做出了限制:let、package、protected、private、public、static、yield、implements、interface
(5).在if语句中不能声明函数,否则会报错

  1. eval()的变化(eval方法——自动计算其中包含的字符串)
function x (){
   eval("var a = 10");
   alert(a);
}

如上函数,在非严格模式中,因为eval中声明了一个变量a,所以最后会弹出对话框显示10;

在严格模式中,eval中声明的所有变量,都只会在计算时存在一个特殊域中,计算完后自动删除,所以最后报错,未声明a;

  1. eval和arguments
    (1)不能使用eval和arguments作为变量名和函数名;
    (2)不能给他们赋另外一个值;
    (3)在try-catch语句中用作例外名

  2. 抑制this

var color = "red";
function x(){
   alert(this.color);
}
x.call(null);

在非严格模式下,给x.call中传入了null,意味着指向全局变量,所以最后弹出red;

在严格模式下,这个函数的this指向的是null,最后访问this的属性时会报错

  1. 去掉了一些东西
    (1)抛弃了with语句

    (2)去掉了JavaScript中的八进制字面量。


严格模式通过在脚本或函数的头部添加 “use strict”; 表达式来声明,可以将它用到全局中,也可以用到指定的函数中。

//f1.js
'use strict'; //整个js文件都是严格模式下执行的

var n = 1;
var foo = function(){...};
//...
var n = 1;
var foo = function(){
    'use strict';
    //在foo函数内是严格模式
    //some code...
}

非严格模式主要是为了向以前版本兼容,在新写的程序中应该使用严格模式,最好是局部使用,因为页面中可能会引入其他的代码。

高手文章
关于js严格模式自己的理解:
https://blog.csdn.net/wyh745933593/article/details/79771724
Js中严格模式和非严格模式的区别:
https://blog.csdn.net/Ayiayi00/article/details/77802810
JavaScript 严格模式(use strict):
http://www.runoob.com/js/js-strict.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值