1.在严格模式下,变量必须显示声明(var/let/const),直接给变量赋值,不会隐式创建全局变量
(function(){//非严格模式a = 10;console.log(a); //10})();(function(){"use strict"; //严格模式b = 10; //ReferenceError: b is not definedconsole.log(b);})();(function(){"use strict"; //严格模式var a=b=1;// //ReferenceError: b is not definedconsole.log(a,b)})();
2.在严格模式下,this默认是undefined
(function(){//非严格模式console.log(this); //window})();(function(){"use strict"; //严格模式console.log(this); //undefined})();
3.在严格模式下,不可以在eval参数中定义变量和函数
(function(){//非严格模式var str1 = "var name='Lily';";var str2 = "function fun1(){console.log('hello');}";eval(str1); //这个name定义在了全局,而不是函数内eval(str2);console.log(name); //Lilyfun1(); //hello})();(function(){"use strict"; //严格模式var str1 = "var alias='Lily';";var str2 = "function fun2(){console.log('hello');}";eval(str1);eval(str2);eval("name = 'Bob'"); //修改全局变量nameconsole.log(name); //Bobconsole.log(alias); //ReferenceError: alias is not definedfun2(); //ReferenceError: fun is not defined})();
4.在严格模式下,有名参数是arguments参数的静态副本,而非引用。
(function(){//非严格模式var name = "Bob";test(name);function test(alias){alias = "Lily";console.log(alias); //Lilyconsole.log(arguments[0]); //Lily}})();(function(){"use strict"; //严格模式var name = "Bob";test(name);function test(alias){alias = "Lily";console.log(alias); //Lilyconsole.log(arguments[0]); //Bob}})();