不可扩展的对象
在严格模式下,不能为不可扩展的对象添加属性。
- 如下代码是非严格模式为不可扩展的对象添加新属性,结果会静默失败。
var obj = {};
Object.preventExtensions(obj); // 将对象变的不可扩展
obj.newProp = "ohai";
- 如下代码是严格模式不可扩展的对象添加新属性,结果会抛出异常。
"use strict"; // 开启严格模式
var obj = {};
Object.preventExtensions(obj); // 将对象变的不可扩展
obj.newProp = "ohai"; // 抛出 TypeError 错误
函数
参数名必须唯一
- 非严格模式下最后一个重名参数名会掩盖之前的重名参数,之前的参数仍然可以通过
arguments[i]
来访问.
function sum(a,a,c){}
- 严格模式下重名参数被认为是语法错误
function sum(a,a,c){ // !!! 语法错误
"use strict"
return a + a + c; // 代码运行到这里会报错
}
arguments
的不同
在严格模式下,arguments
对象的行为也有所不同。
- 如下代码非严格模式下,修改密码参数的值也会有反应到
arguments
对象中。 - 如下代码严格模式下,命名参数与
arguments
对象是完全独立的。
/开启严格模式
"use strict";
function fn(value){
var value = 'change';
console.log(value); // change -> 就近原则
/*
*非严格模式下 - arguments 对象获取参数的值与形参有关的
* 如果局部变量与形参名相同 - 根据就近原则进行获取
*严格模式下 - arguments 对象获取参数的值与形参无关的
*/
console.log(arguments[0]); // change
}
fn('Change'); // Change
arguments.callee()
在严格模式下,不能使用 arugments
对象的 callee()
方法。
- 如下代码非严格模式下使用
arugments
对象的callee()
方法,表示调用函数本身。
var f = function(){
return arguments.callee;
} ;
- 如下代码严格模式下使用
arugments
对象的callee()
方法,结果会抛出异常。
"use strict"; // 开启严格模式
var f = function(){
return arguments.callee;
};
f(); // 抛出 TypeError 错误
函数声明的限制
在严格模式下,只能在全局域和函数域中声明函数。
- 非严格模式下在任何位置声明函数都是合法的。
if (ture){
function f(){}
}
- 严格模式下在除全局域和函数域中声明函数是语法错误。
"use strict"; // 开启严格模式
if (true){
function f() {} // 语法错误
}
eval()
函数:增加 eval
作用域
在严格模式下,使用eval()函数创建的变量只能在 eval()
函数内部使用。
- 非严格模式下
eval()
函数创建的变量在其他位置可以使用
eval("var x = 42");
console.log(x); // 42
- 严格模式下
eval()
函数创建的变量只能在eval()
函数内部使用。
"use strict"; // 开启严格模式
eval("var x = 42");
console.log(x); // 抛出ReferenceError错误
arguments
对象 - 禁止读写
严格模式下,禁止使用 eval()
和 arguments
作为标识符,也不允许读写他们的值。
- 使用var声明
- 赋予另一个值
- 尝试修该包含的值
- 用作函数名
- 用作命名的函数的参数
- 在
try...catch
语句中用作例外名
在严格模式下,以下所有尝试将导致语法错误的:
"use strict"; // 开启严格模式
eval = 17;
arguments++;
++eval;
var obj = {set p(arguments){} };
var eval;
try {} catch (arguments){}
function x(exal){}
function arguments() {}
var y = function eval(){};
var f = new Function(
"arguments","'use strict';return 17;"
);
this
关键字 - 抑制 this
-
在非严格模式下使用函数的
apply()
或call()
方法时,null
或undefined
值会被转换为全局对象。 -
在严格模式下,函数的
this
值始终是指定的值(无论什么值)。
var color = 'red';
function sayColor(){
console.log(this.color); // 非严格模式下 red
} // 严格模式下 抛出错误
sayColor.call(null);