JS(JavaScript)
一.严格模式
1.概述数组
在JS中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差别
严格模式和非严格模式可共存,可选择性的加入严格模式app
将JS把陷阱直接变为明显错误
修正一些引擎难以优化错误,代码有些时候严格模式会比非严格模式更快
禁用了一些以被定义的语法
2.开启严格模式dom
//开启严格模式-做用于全局做用域 // "use strict " //定义个变量-不使用var关键字 a = 100; console.log(a); function fn() { // "use strict" //开启严格模式-做用于函数做用域 v = 200; console.log(v) } fn();
3.变量函数
在非严格模式下在函数做用域中定义变量,不使用var关键字-自动为全局变量
在严格模式下在函数做用域中定义变量,会报错
会显示ReferenceError优化
// 开启严格模式 // "use strict"; v = 100; console.log(v); function fn() { //在非严格模式:在函数做用域中定义变量 //不使用var关键字-自动为全局变量 q = 200; console.log(q); } fn(); console.log(q);
在非严格模式下静默失败
在严格模式下会显示TypeError错误this
//开启严格模式 "use strict"; const v = 3.14;//定义变量 v = 1.14;//从新赋值 console.log(v);
在非严格模式下使用delete,结果为静默失败
在严格模式下使用delete,结果会ReferenceError错误prototype
//开启严格模式 "use strict"; //严格模式下禁用delete关键字-针对删除变量,而不是数组元素和对象属性 var v = 100;//定义个全局变量 console.log(v); delete v;//删除全局变量v console.log(v);//undefined var arr = [1,2,3,4,5]; delete arr[0]; console.log(arr); var obj = { name : '犬夜叉'
在非严格模式,定义个变量时,使用保留名,静默失败
在严格模式定义个变量时,使用保留名会语法报错code
//开启严格模式 "use strict"; var static = 100;//定义个变量 console.log(static);
4.对象对象
非严格模式使用delete不可删除属性,结果静默失败
严格模式使用delete不可删除属性结果会出现异常TypeError错误ip
"use strict" //开启严格模式 // delete Object.prototype; //使用delete 删除Object对象原型属性 // console.log(Object.prototype); //在调用Object对象原型属性 delete Math.random; console.log(Math.random); // Math.random();
在非严格模式重名是容许的,重名属性决定其属性值
在严格模式重名会被认为语法错误
"use strict"; var obj = { name : '犬夜叉', name : '戈薇' } console.log(obj.name); 调用个对象属性
在非严格模式下只读属性从新赋值,结果会静默失败
在严格模式下只读属性从新赋值,结果会显示TypeError异常
//判断指定属性是不是只读属性 var obj = { name : '犬夜叉' } // var result = Object.getOwnPropertyDescriptor(obj,'name'); console.log(result); Object.defineProperty(obj,'age',{ //定义对象obj只读属性 value : 16 }); //只读属性更改 // obj.age = 80; // console.log(obj.age);
在非严格模式下不可扩展对象添加新属性,结果会静默失败
在严格模式下不可扩展对象添加新属性,结果会显示TypeError异常
// "use strict"; var obj = {}; Object.preventExtensions(obj); //设置对obj是个不可扩展对象 obj.name = '犬夜叉'; //对象obj新增属性 console.log(obj);
5.函数
在非严格模式下最后个重名参数名会覆盖以前重名参数,参数仍然能够经过arguments[i]来访问
在严格模式下重名参数认为语法显示出错
// "use strict"; //开启严格模式 function fn(a, a, b) { //定一个函数 console.log(a + a +b); } fn(1,2,3);
在非严格模式下修改参数值也会反应到arguments对象中
在严格模式下命名参数与arguments对象是彻底独立
// "use strict"; //开启严格模式 function fn(value) { //定义哥函数 var value = '犬夜叉'; //定义个变量 console.log(arguments[0]);//犬夜叉 //调用变量 } fn('戈薇');
在非严格模式下使用arguments对象的callee()方法调用函数自身
在严格模式下使用arguments对象的callee()方法结果会显示TypeError错误
// "use strict"; //开启严格模式 function fn() { //定义哥函数 console.log(arguments.length); // return arguments.callee; } fn(); //调用函数
在非严格模式下在任何位置声明函数是容许的
在严格模式下在除全局和函数域声明函数语法错误
"use strict"; //开启严格模式 function fn(){ //定义个函数 function n(){} } for (var i=0; i<10; i++) { var v = 100; function f(){ console.log('you my function'); } } console.log(v); f();
6.eval()
-增长eval做用域
在非严格模式下使用eval函数创建的变量可在其它位置使用
在严格模式下使用eval函数创建的变量只能在eval函数内使用
"use strict"; //开启严格模式 eval('var v = 100,'); //在严格模式,增长eval做用域-eval()函数定义变量只能在eval()函数中使用 console.log(v);//100 //在全局做用域中调用变量-报错
7.arguments对象
在非严格模式下使用eval或arguments为标识符时会静默失败
在严格模式下使用eval或arguments为标识符时会显示SyntaxError错误
// "use strict"; //开启严格模式 evel = 16; arguments++; ++evel; var obj = { set p(arguments) { } }; var eval; try { } catch (arguments) { } function x(eval) { } function arguments() { } var y = function eval() { }; var f = new Function("arguments","'use strict'; return 16;");
8.this关键字
在非严格模式下使用函数apply()和call()或null和undefined会被转换为全家对象
在严格模式下使用函数的this值最终是指定值,但会显示出错
// "use srict"; var v = 100; //定个全局变量 function fn() { // 定义个函数 console.log(this.v); } var obj ={ v : 200 } fn.call(obj);