理解理解javascript中的严格模式中的严格模式
一、什么是严格模式一、什么是严格模式
我们平时写的JavaScript代码一般都运行在正常模式中的,除了正常运行模式,ECMAscript 5添加了第二种运行模式:”严格模
式”(strict mode)。看名字就知道,这种模式会让JavaScript在更严格的环境中运行。
包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱。(github上面好多项目都是用的严格模式)
二、启用严格模式二、启用严格模式
为整个脚本启用严格模式
在所有语句之前放一个特定语句 “use strict”;
假设有一个脚本reeoo.js,可以这样开启严格模式:
"use strict";
var name = "Reeoo";
console.log(name);
BUT这种写法存在天然的坑,假如我们要做代码合并,我现在要把heigui.js:
heigui = "db";
和reeoo.js进行合并,本来两个脚本分开执行是好好的,合起来就会报错。
Uncaught ReferenceError: heigui is not defined(…)
一个严格模式的脚本和一个非严格模式的脚本合并可能会导致非严格模式的脚本代码报错,建议代码都包在一个立即执行函数里
面。
(function(){
"use strict";
var name = "reeoo";
})();
(function(){
heigui = "db";
})();
这样合并之后就不会报错了。
为某个函数启用严格模式为某个函数启用严格模式
要给某个函数开启严格模式,得把”use strict”; 声明放在函数体所有语句之前就行了。
function strictFun()
{
// 函数级别严格模式语法
'use strict';
console.log('I am a strictmode function!');
}
function normalFun() {
console.log('I am a mormal function!');
}
Chrome中调试严格模式中调试严格模式
我有这么一段代码:
'use strict'
name = "reeoo";
console.log(name)
把这段代码直接粘贴到Chrome的控制台中执行,正常情况下应该报错,但是并没有报错,
很显然,严格模式下变量不适用var声明是不合法的,但是为什么没有报错?
这是什么鬼,难道Chrome不支持严格模式?开什么玩笑。。。
网上搜了一下,原来Chrome的控制台的代码是运行在eval之中的,你没法对eval函数使用严格模式(应该也不完全对,但是具体
Chrome做了什么,不得而知),下图说明eval函数可以使用严格模式: