1

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);

佐珥玎
41 声望8 粉丝