资讯专栏INFORMATION COLUMN

【JavaScript】面向对象之严格模式

siberiawolf / 961人阅读

摘要:一严格模式概述严格模式是什么在中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差异严格模式和非严格模式可共存,可选择性的加入严格模式严格模式的目的将把陷阱直接变为明显错误修正一些引擎难以优化错误,代码有些时候严格模式会比非严

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96974.html

相关文章

  • javascript 面向对象版块对象属性

    摘要:上一篇面向对象版块之理解对象下一篇面向对象版块之定义多个对象属性以及读取属性特性 这是 javascript 面向对象版块的第二篇文章,主要讲解的是对象的属性,首先创建一个对象: var person = { name: Nicholas, age: 29, job: Software Engineer, sayName: function () { conso...

    lolomaco 评论0 收藏0
  • JavaScript 面向对象 [ 严格模式 ]

    摘要:严格模式描述严格模式可以分别作用在全局作用域中和函数作用域中严格模式是对代码的一种限制方式严格模式可以将不明确显示的错误转变成明确显示严格模式可以修正一些解释器难以优化的错误严格模式下的变量禁止意外创建变量没有开启严格模式时在调用该变量时, 严格模式 描述 严格模式可以分别作用在全局作用域中和函数作用域中 严格模式是对JavaScript代码的一种限制方式 严格模式可以将不明确显...

    zsirfs 评论0 收藏0
  • javascript设计模式与开发实践全书深度解析(一)前言

    摘要:相信很多人都看过设计模式与开发实践这本书,每个人都有自己的体会感受,作为前端年开发经验的程序猿,用我自认为还可以的实践经验来与大家谈谈这本书。这章是前言,后面陆续会讲解每个设计模式。 相信很多人都看过《javascript设计模式与开发实践》这本书,每个人都有自己的体会感受,作为前端3年开发经验的程序猿,用我自认为还可以的实践经验来与大家谈谈这本书。这章是前言,后面陆续会讲解每个设计模...

    timger 评论0 收藏0
  • JavaScript new 命令

    摘要:命令执行时,构造函数内部的,就代表了新生成的实例对象,表示实例对象有一个属性,值是。因此,应该非常小心,避免不使用命令直接调用构造函数。命令返回这个对象,而不是对象。JavaScript 面向对象编程的基础知识篇 1 。 1. 概述 面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。 那么,对象(object)到底是什么? 对象是单...

    desdik 评论0 收藏0
  • JavaScriptarguments

    摘要:三的属性属性表示传入函数的实际参数数量,而不是函数声明时的形参数量。你好你好你好你好你好你好扩展运算符你好你好五严格模式严格模式和非严格模式中,的表现显示不相同。而在严格模式中,实参和的值不会共享。 本文共 635 字,读完只需 3 分钟 概述 JavaScript中的函数与其他面向对象语言有几个不同的地方。 没有函数重载 有一个表示实参列表的类数组对象 arguments 一、...

    miqt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<