你的代码需要规范化——严格模式(二)

不可扩展的对象

在严格模式下,不能为不可扩展的对象添加属性。

  • 如下代码是非严格模式为不可扩展的对象添加新属性,结果会静默失败。
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() 方法时, nullundefined 值会被转换为全局对象。

  • 在严格模式下,函数的 this 值始终是指定的值(无论什么值)。

var color = 'red';

function sayColor(){
	console.log(this.color);	// 非严格模式下 red
}							    // 严格模式下 抛出错误

sayColor.call(null);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值