JS(JavaScript)
一.严格模式
1.概述
- 严格模式是什么
在JS中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差异
严格模式和非严格模式可共存,可选择性的加入严格模式
- 严格模式的目的
将JS把陷阱直接变为明显错误
修正一些引擎难以优化错误,代码有些时候严格模式会比非严格模式更快
禁用了一些以被定义的语法
2.开启严格模式
//开启严格模式-作用于全局作用域
// "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错误
//开启严格模式
"use strict";
const v = 3.14;//定义变量
v = 1.14;//重新赋值
console.log(v);
- 禁用delete关键字
在非严格模式下使用delete,结果为静默失败
在严格模式下使用delete,结果会ReferenceError错误
//开启严格模式
"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 : '犬夜叉'
- 对变量名的限制
在非严格模式,定义个变量时,使用保留名,静默失败
在严格模式定义个变量时,使用保留名会语法报错
//开启严格模式
"use strict";
var static = 100;//定义个变量
console.log(static);
4.对象
- 不可删除的属性
非严格模式使用delete不可删除属性,结果静默失败
严格模式使用delete不可删除属性结果会出现异常TypeError错误
"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对象中
在严格模式下命名参数与arguments对象是完全独立
// "use strict";
//开启严格模式
function fn(value) {
//定义哥函数
var value = '犬夜叉';
//定义个变量
console.log(arguments[0]);//犬夜叉
//调用变量
}
fn('戈薇');
- arguments对象的callee()方法
在非严格模式下使用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关键字
- 抑制this
在非严格模式下使用函数apply()和call()或null和undefined会被转换为全家对象
在严格模式下使用函数的this值最终是指定值,但会显示出错
// "use srict";
var v = 100;
//定个全局变量
function fn() {
// 定义个函数
console.log(this.v);
}
var obj ={
v : 200
}
fn.call(obj);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。