JS在严格模式和非严格模式的区别

若想在严格模式下使用JS,需要在文件的第一行加上“use strict”,在实际开发中,常常将“use strict”加入到闭包的内部

具体是:

  • 整个脚本中使用:在这个JavaScript文件开头写'use strict'; 在闭包内部中使用 funtion () { 'use strict'; }
  • 严格模式下,不允许使用with
with语句 扩展一个语句的作用域链。
with (expression) {
    statement
}
  • 严格模式下,不允许给未声明的变量赋值
  • 严格模式下,arguments与参数不存在映射关系
function(h) {
    arguments[0] = 100;
    console.log(h);  //100
}(1);

function(h) {
    'use strict';
    arguments[0] = 100;
    console.log(h);  //1
}(1);
但是,但参数是对象时,是存在映射关系的:
function(h) {
    'use strict';
console.log(h.a);//1 arguments[0].a = 100; console.log(h.a); //100 }({a:1});
  • 严格模式下,删除参数名,函数名报错。非严格模式返回false,不报错也没有任何效果
function(h) {
    console.log(h);  //1
    console.log(delete h);  //false
    console.log(a);  //1
}(1);

function(h) {
    'use strict';
    console.log(h);  //1
    delete h;  //SyntaxError(语法错误)
    console.log(h);  //1
}(1)
  • 严格模式下,函数参数名重复报错。非严格模式最后一个重名参数会覆盖之前的重名参数。
function (a, a, b) {
    console.log(a + b);  //5
}(1, 2, 3);

!function (a, a, b) {
    'use strict';
    console.log(a + b);  //SyntaxError
}(1, 2, 3);
  • 严格模式下,删除不可配置(configurable=false)的属性报错。非严格模式返回false,不报错也没有任何效果
function (a){
    var obj={};
    Object.defineProperty(obj,'a',{ configurable: false });
    console.log(delete obj.a); //flase
}(1);  
        
!function (a){
    'use strict';
    var obj={};
    Object.defineProperty(obj, 'a', { configurable: false });
    console.log(delete obj.a); //TypeError
}(1);
  • 严格模式下,修改不可写(writable=false)的属性报错
unction () {
    var obj = { a: 1 };
    Object.defineProperty(obj, 'a', { writable: false });
    obj.a = 2;
    console.log(obj.a);  //1  //证明没有被修改
}();

!function () {
    'use strict';
    var obj = { a: 1 };
    Object.defineProperty(obj, 'a', {writable: false});
    obj.a = 2;  //TypeError
}();
  • 严格模式下,一般函数调用,this指向undefined,而不是全局对象
function () {
    function fun() { return this; }
    console.log( fun() );  //Window
}();

!function () {
    'use strict';
    function fun() { return this; }
    console.log( fun() );  //undefined
}();
  • 严格模式下,不再支持arguments.callee/caller

猜你喜欢

转载自www.cnblogs.com/yuan233/p/10300887.html