<script type="text/javascript">
"use strict"; //针对脚本文件:将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"普通模式"运行。
</script>
<script type="text/javascript">
var abc = function () //针对单个函数:将"use strict"放在函数体的第一行,则整个函数以"严格模式"运行
{
"use strict";
};
</script>
<script type="text/javascript">
//脚本文件的变通写法:因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。
(
function () {
"use strict";
}
)();
</script>
1.变量必须通过var进行声明,否则将会报错
<script type="text/javascript">
"use strict";
x = 1;
alert(x);
for (i = 0; i < 10; i++) {
alert(i);
}
</script>
2.JavaScript禁掉了while关键字
<script type="text/javascript">
"use strict";
var obj = {};
obj.a = 1;
obj.b = 2;
while(obj) { //with尽量少用,因为有可能会造成内存泄漏,特别是IE
alert(a + b);
}
</script>
3.普通模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
<script type="text/javascript">
"use strict";
/*var abc = function()
{
eval("var x = 200;");
}
abc();
alert(x); //200 */
eval("var x = 200; alert(x);");
alert(x); //报错
</script>
4.为了让代码更安全 禁止this关键字指向全局对象
<script type="text/javascript">
"use strict";
var fn = function () {
console.log(this);
};
fn(); //undefined
//所以,构造函数只要不通过new实例化对象,那么就会直接报错,因为undefined无法设置属性
var Cat = function (name) {
this.name = name;
this.say = function () {
alert(this.name);
}
};
Cat("咪咪");
window.say();
console.log(window);
</script>
5.为了让代码更安全 禁止在函数内部遍历调用栈
<script type="text/javascript">
"use strict";
var fn = function () {
alert(fn.arguments.length);
};
fn("abc", "cbd");
</script>
6.为了让代码更安全 禁止删除变量
<script type="text/javascript">
"use strict";
/*var x = 123;
delete x;
alert(x); //报错 */
var obj = {};
obj.y = 100;
delete obj.y; //可以删除引用类型的属性
alert(obj.y);
</script>
7.普通模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。
<script type="text/javascript">
"use strict";
</script>
8.严格模式下,对禁止扩展的对象添加新属性,会报错。
<script type="text/javascript">
//"use strict";
var o = {};
o.x = 100;
Object.preventExtensions(o); //Object禁止添加的方法
o.y = 200;
console.log(o);
</script>
9.普通模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
<script type="text/javascript">
"use strict";
var o = {
x: 200,
x: 300
};
console.log(o); //报错
</script>
10.普通模式下,如果函数有多个重名的参数(解决办法可以用arguments[i]读取)。严格模式下,多个重名的参数这属于语法错误。
<script type="text/javascript">
"use strict";
var fn = function (x, x, y) {
alert(x + y);
};
fn(1, 2)
</script>
11.禁止八进制表示法:普通模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。
<script type="text/javascript">
"use strict";
var x = 0100;
alert(x);
</script>
12.arguments对象的限制:arguments是函数的参数对象,严格模式对它的使用做了限制。
1:不允许对arguments赋值
2:arguments不再追踪参数的变化
3:禁止使用arguments.callee 这意味着,我们无法在匿名函数内部调用自身(递归)了。
<script type="text/javascript">
"use strict";
/*var fn = function() //不允许对arguments进行赋值
{
arguments = 100;
};
fn();*/
/*var fn = function(num)
{
num += 100;
alert(num);//200
alert(arguments[0]); //不使用严格模式的情况下arguments会追踪num变化,值为200,但在严格模式下,不会追踪,值为100的原始值,可以利用这个特性获取原始值
};
fn(100);*/
var num = 0;
(
function (num) {
num++;
if (num <= 5) {
alert(num);
arguments.callee(num); //在匿名函数中使用递归的方法
}
}
)(num);
</script>
13.函数必须声明在顶层:将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。换句话说,不允许在非函数的代码块内声明函数。
<script type="text/javascript">
"use strict";
var a = 6;
if (a > 5) { //严格模式下不能在块级作用域中声明函数,但匿名函数例外
(
function () {
alert("我虽然也在if里,但是我是这种方式声明的函数,没关系");
}
)();
/*function fn()
{
alert("严格模式下,我不应该在这里被声明,这不是我应该待在的地方");
}
fn();*/
}
</script>
14.不允许使用关键字
为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
<script type="text/javascript">
"use strict";
var interface = "interface";
alert(interface); //会报错
/*var extends = "inteface";
alert(extends);*/
</script>