java严格模式_“use strict” 严格模式使用(前端基础系列)
ECMAscript5添加一种严格模式的运行模式("use strict"),让你的js语句在更加严格的环境下进行运行;
一、主要作用:
消除版本javascript中一些不合理及不严谨之处,减少怪异行为
提高编译效率,提高运行速度
为新版本的javasript做铺垫兼容
二、如何使用
启动严格模式的标志就是,在开头第一行中添加"use strict"字符串,在低版本的浏览器,或是说js引擎中,只是把这个标志当做一句字符串而已,而支持ES5的浏览器会进行启动“严格模式”;具体有两种调用方式:
针对整个脚本文件有效
在js文件的第一行中添加"use strict",或是在
"use strict";//严格模式
//do something
//非严格模式
//do something
针对单个函数有效
将 "use strict" 放在函数的第一行,则整个函数有效
functionstrict(){"use strict";//严格模式
//do something
}
更加通用的写法,由于第一种方法,不利于文件的合并,根据针对函数的形式,可以将脚本文件包裹在一个自执行的匿名函数中,这样相当于所有语句都在一个严格模式的函数中执行
(function(){"use strict";//严格模式
//do something
}())
三、语法与行为变更
全局变量的显示声明
正常模式下,对于使用没有进行声明的变量,编译时默认改变量为全局变量(添加到window对象的属性中,可以使用delete进行删除),而严格模式下进行了限制,使用变量前必须声明(var/let/const);
functionstrict(){"use strict";
name= "ukerxi";
console.log(name);
}functionnoStrict(){
name= "ukerxi";
console.log(name);
}//执行函数
strict(); //报 Uncaught ReferenceError: name is not defined(引用错误)
noStrict(); //==> 'ukerxi'
禁止使用with语句
正常模式下with语句允许当前代码执行在新的变量对象中,即改变了执行环境;在严格模式下,已经禁止使用with语句,由于只有运行时才知道语句的执行环境,所以执行非常耗时缓慢;
var foo ={
name:"ukerxi",
hobby:'no'};with(foo){
console.log(name);//==> 'ukerxi'
}创设eval的作用域
正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部;
"use strict";var name = 'ukerxi';
eval('var name = "originEval";');
console.log(name);//==> "ukerxi"
但是存在一种情况,就是当你使用变量进行缓存eval函数时,再使用缓存变量进行执行操作,会产生正常模式下执行eval函数的效果(暂时不知道这个bug是语言本身的设计,还是其他原因导致的)
"use strict";var name = 'ukerxi';var globalEval = eval; //缓存一个全局的eval函数
eval('var name = "originEval";');
console.log(name);//==> "ukerxi"
//使用缓存进行执行函数,会导致变更作用域
globalEval('var name = "globalEval";');
console.log(name);//==> "globalEval"禁止this执行全局对象,默认指向undefined
"use strict";
console.log(this); //==> undefined
禁止使用arguments.caller和arguments.callee进行调用自身及被调用函数
"use strict";functiontestHandle(){
console.log(arguments.caller);//报错
console.log(arguments.callee); //报错
}
禁止修改arguments变量参数对象,arguments不再追踪参数的变化
"use strict";functiontestHandle(){
arguments= "test"; //报语法错误
}
禁止删除变量
"use strict";var name = "ukerxi";delete name; //报错
重名错误(函数参数重名&&对象重名属性)
"use strict";//属性重名报错
var testObj ={
name:"ukerxi",
name:"test"};//参数重名报错
functiontestHandle(a, a, b){//do something
}
禁止八进制表示法
"use strict";var n = 0100; //语法错误
函数必须声明在顶层
Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数
"use strict";if (true) {function f() { } //语法错误
}for (var i = 0; i < 5; i++) {function f2() { } //语法错误
}
针对对象的操作,对于声明只读属性的对象不可修改,删除不可删除的属性报错
"use strict";var foo ={};//只读属性的对象不可修改
Object.defineProperty(foo, "v", { value: 1, writable: false});
foo.v= 2; //报错
//删除不可删除的属性报错
delete Object.prototype; //报错
//严格模式下,对一个使用getter方法读取的属性进行赋值,会报错
var foo1 ={
get v() {return 1; }
};
foo1.v= 2; //报错
//严格模式下,对禁止扩展的对象添加新属性,会报错。
var foo2 ={};
Object.preventExtensions(foo2);
foo2.v= 2; //报错
保留字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。(主要是与类有关的保留字,和java类的关键字)
【参考链接】
【结束语】
系列文章,包括了原创,翻译,转载等各类型的文章;一方面是为了自己总结,另一方面页希望可以共享知识;在技术方面有输入,也要有所输出,才能更进一步!文章基于自己的实践、阅读及理解,如有不合理及错误的地方,烦请各大佬评论指出,以便改正,感谢!
java严格模式_“use strict” 严格模式使用(前端基础系列)相关推荐
- gif透明背景动画_前端基础系列之bmp、jpg、png、gif、svg常用图片格式浅谈(二)...
IT客栈 作者:大腰子 bmp.jpg.png.gif.svg常用图片格式 之前为大家介绍了几种WEB前端常用的图片格式,对比了它们的特点,参见<前端基础系列之bmp.jpg.png.gif.s ...
- java单例模式恶汉模式_单例模式之懒汉模式恶汉模式
单例模式,其实就是对于一个类,只能新建一个对象,不能有多个重复的对象.这样使得在程序在运行时,比如日志加载时能找到唯一的对象,以至正确匹配.就类似于一山不能有二虎一样.主要的思想其实就是运用stati ...
- “use strict” 严格模式使用(前端基础系列)
ECMAscript5添加一种严格模式的运行模式("use strict"),让你的js语句在更加严格的环境下进行运行: 一.主要作用: 消除版本javascript中一些不合理及 ...
- 小米6怎么解除温控_小米6性能模式_小米6性能模式怎么关
小米6性能模式怎么关_小米手机6_MIUI论坛 1080x1920 - 201KB - PNG 小米6性能模式没了 720x1280 - 32KB - JPEG 小米6怎么没有性能模式了_开发者交流_ ...
- 组合模式_[设计模式]10.组合模式
组合模式,也叫"部分整体模式",它把相似的对象组合成树形结构的一个整体.于是,只需一个代表,我们就能继续访问与之相关的同族对象. 模式卡片 模式UML图 七个例子 部门里人很多,大 ...
- mysql属于数据库三级模式_数据库系统的三级模式指的是什么
数据库系统的三级模式指的是什么 发布时间:2020-10-26 10:11:21 来源:亿速云 阅读:52 作者:小新 小编给大家分享一下数据库系统的三级模式指的是什么,希望大家阅读完这篇文章后大所收 ...
- 抽象工厂模式_设计模式——抽象工厂模式
阅读目录 使用频率:★★★★★ 一.什么是抽象工厂模式 二.补充说明 三.角色 四.例子 使用频率:★★★★★ 一.什么是抽象工厂模式 就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位): ...
- 苹果手机没有声音显示耳机模式_安卓苹果暗色模式PK,看完之后没有夜猫子不选Ta|ios|手机|暗色|黑色|coloros...
刷微博.追剧.逛淘宝--手机上现在的文娱内容变得越来越丰富,睡前玩一会儿手机已经成为了越来越多人的习惯.众所周知,在关灯后的黑暗环境中玩手机,会对眼睛产生比较大的刺激.为了保护好用户们的眼睛,手机厂商 ...
- mysql关系模式_数据库学习--关系模式
最近开始做数据库的大实验,其中有一条实验要求如下: 通过网络查找相关文献并参考所给资料进行需求分析,画出系统的 E-R 图,给出实体或联系的属性,标明联系的种类,并写出关系模式. 画ER图没有什么问题 ...
最新文章
- LR分析法从理解到运用
- LeetCode 滑动窗口(Sliding Window)类问题总结
- Ubuntu 虚拟机空间不足增加空间笔记
- 14条建议,使你的IT职业生涯更上一层楼
- matlab 行 读取文件 跳过_用Matlab处理LAS点云(1)——LAS文件概述
- 安装docx模块出现Import Error: No module named 'exceptions'的解决方案
- 通过libusb操作usb设备扫描二维码
- [deviceone开发]-do_SlideListView的简单示例
- 牛客网 【每日一题】5月29日 管道取珠
- c++ 不插入重复元素但也不排序_面试时写不出排序算法?看这篇就够了
- vue 圆形 水波_vue项目百度地图+echarts的涟漪水波效果
- python以什么表示代码层次_python 中几个层次的中文编码.md
- minifilter 与用户态的通信
- php 类别名,关于php:从类别ID laravel获取类别名称
- 揭秘山寨手机“四寨主”:都高仿苹果iPhone
- NetWare 客户服务禁用了欢迎屏幕和快速切换恢复方法
- 微博营销推广策略分析
- 微生物组-扩增子16S分析第10期(报名直播课免费参加线下2020.10)
- 【Pytorch官方教程】从零开始自己搭建RNN1 - 字母级RNN的分类任务
- Syzkaller最后一步运行./bin/syz-manager 无法启动虚拟机 failed to create instance: failed to read from qemu: EOF
热门文章
- OpenCASCADE:使用扩展数据交换 XDE之几何尺寸和公差 (GDT)
- boost::spirit模块实现使用单个融合序列来生成不同序列中元素的输出的测试程序
- BOOST_MP11_VERSION宏用法的测试程序
- boost::hana::symmetric_difference用法的测试程序
- boost::geometry::svg用法的测试程序
- boost::function模块boost::ref的测试程序
- GDCM:提取DICOM文件的加密内容到der文件的测试程序
- Boost:BOOST_ASSERT扩展的用法测试程序
- DCMTK:OFStack类的测试程序
- VTK:隐式函数之IsoContours