JavaScript的严格模式

一、严格模式简介

javascript严格模式即在严格的条件下运行。严格模式通过在脚本或函数的头部添加"use strict"; 表达式来声明。

设计严格模式的目的,主要有以下几个:

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫。

二、严格模式的限制

1.不能使用未声明的变量

    "use strict";
    x = 1;
    console.log(x);

2.禁止使用with语句

var x = 1;
     with(o) {
     x = 2;
     }

.

3.设置eval作用域

    var x = 1;
    console.info(eval("var x = 5; x"));
    console.info(x);

4.禁止this指向全局对象

    function f(){
        return !this;
    }
    console.log(f());
    // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。

5.禁止在函数内部遍历调用栈

    function f1() {
        "use strict";

        f1.caller;
        f1.arguments;
    }

    f1();

6.禁止删除变量

"use strict";

  var x;

  delete x;

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

    "use strict";
    var o = {};
    Object.defineProperty(o, "v", {value: 1, writable: false});
    o.v = 2;

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

    "use strict";

    var o = {
        get v() { return 1; }
    };
    o.v = 2;

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

    "use strict";

  var o = {};

  Object.preventExtensions(o);

  o.v = 1;

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

    "use strict";

  delete Object.prototype;

11.对象不能有重名的属性。

"use strict";
    var o = {
        p: 1,  
        p: 2  
    };  //语法错误

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

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

 

13.禁止八进制表示法

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

14.不允许对arguments赋值

"use strict";
    arguments++; // 语法错误
    var obj = { set p(arguments) { } }; // 语法错误
    try { } catch (arguments) { } // 语法错误
    function arguments() { } // 语法错误
    var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误

15.arguments不再追踪参数的变化

function f1(a) {
        a = 2;
        return [a, arguments[0]];
    }
    console.log(f1(1)); // 正常模式为[2,2]
    function f2(b) {
        "use strict";
        b = 2;
        return [b, arguments[0]];
    }
    console.log(f2(1)); // 严格模式为[2,1]

16.禁止使用arguments.callee,这意味着,你无法在匿名函数内部调用自身了。

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

17.严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

"use strict";

  if (true) {

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

  }

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

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

  }

18.严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。

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

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

    "use strict";

    var implements; // 语法错误

  }

此文转载自 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值