严格模式
:使用严格模式的好处是能够提前知道代码中存在的错误,及时捕获一些可能致使编程错误的 ECMAScript 行为。javascript
严格模式的编译指示(pragma): "use strict";
,支持严格模式的引擎会启动这种模式,而不支持该模式的引擎就当遇到了一个未赋值的字符串字面量,会忽略这个编译指示。java
function test () {
"use strict";
...
}
复制代码
// 未声明变量
// 非严格模式:建立全局变量
// 严格模式:抛出 ReferenceError
message = "Hello world! ";
复制代码
//删除变量
//非严格模式:静默失败
//严格模式:抛出 ReferenceError
var color = "red";
delete color;
复制代码
// 重名属性
// 非严格模式:没有错误,以第二个属性为准
// 严格模式:抛出语法错误
var person = {
name: "Nicholas",
name: "Greg"
};
复制代码
//重名参数
//非严格模式:没有错误,只能访问第二个参数
//严格模式:抛出语法错误
function sum (num, num){
// todo
}
复制代码
//修改命名参数的值
//非严格模式:修改会反映到 arguments 中
//严格模式:修改不会反映到 arguments 中
function showValue(value) {
value = "Foo";
console.log(value); //"Foo"
console.log(arguments[0]); //非严格模式:"Foo",严格模式:"Hi"
}
showValue("Hi");
复制代码
//访问 arguments.callee
//非严格模式:没有问题
//严格模式:抛出 TypeError
function factorial(num){
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
var result=factorial(5);
复制代码
//在 if 语句中声明函数
//非严格模式:将函数提高到 if 语句外部
//严格模式:抛出语法错误
if (true){
function doSomething(){
// todo
}
}
复制代码
//使用 eval()建立变量
//非严格模式:弹出对话框显示 10
//严格模式:调用 alert(x)时会抛出 ReferenceError
function doSomething(){
eval("var x=10");
alert(x);
}
复制代码
"use strict";
var result = eval("var x=10, y=11; x+y");
alert(result); // 21
复制代码
严格模式已经明确禁止使用 eval 和 arguments 做为标识符,也不容许读写它们的值。编程
// 把 eval 和 arguments 做为变量引用
// 非严格模式: 没问题,不出错
// 严格模式: 抛出语法错误
var eval = 10;
var arguments = "Hello world!";
复制代码
在非严格模式下使用函数的 apply()或 call()方法时,null 或 undefined 值会被转换为全局 对象。而在严格模式下,函数的 this 值始终是指定的值,不管指定的是什么值。app
// 访问属性
// 非严格模式: 传入null, 函数的this值是全局对象
// 严格模式: 抛出错误,由于this的值为 null
var color = "red";
function displayColor(){
alert(this.color);
}
displayColor.call(null);
复制代码
//with 的语句用法
//非严格模式:容许
//严格模式:抛出语法错误
with(location){
alert(href);
}
复制代码
//使用八进制字面量
//非严格模式:值为 8
//严格模式:抛出语法错误
var value = 010;
复制代码
//使用 parseInt()解析八进制字面量
//非严格模式:值为 8
//严格模式:值为 10
var value = parseInt("010");
复制代码