资讯专栏INFORMATION COLUMN

javascript之严格模式

zoomdong / 1780人阅读

阮一峰的网络日志——Javascript严格模式详解

“严格模式”的目的

消除javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

消除代码运行的一些不安全之处,保证代码运行的安全;

提高编译器效率,增加运行速度;

为未来版本的JavaScript做好铺垫

“严格模式”标志


(function(){
    "use strict";
    //code here
})();
语法的改变 全局变量显示声明
"use strict"
v=1; //报错,v未声明
for(i=0;i<2;i++){
}//报错,i未声明
静态绑定 禁止使用with语句
"use strict"
var v=1;
with(o){
    v=2;
}//语法错误
创设eval作用域

正常模式下,javascript语言有两种变量作用域(scope):全局作用域和函数作用域,严格模式创设了第三种作用域:eval作用域
严格模式下,eval作用域中生成的变量只能用于内部

“use strict”;
var x=2;
console.info(eval("var x=5;x")); //5
console.info(x);//2
增强的安全措施 禁止this关键字指向全局对象
function f(){
    return !this;
}//false

function f(){
    "use strict";
    return !this;
}//true,严格模式下this的值为undefined,!this的值为true

function f(){
    "use strict";
    this.a = 1;
};
f();//报错,this未定义
只能使用new f(),将this的指向明确的对象
禁止在函数内部遍历调用栈
function f1(){
    "use strict";
    f1.caller; //报错
    f1.arguments;//报错
}
禁止删除变量

严格模式下无法删除变量,只有configurable设置为true的对象属性,才能被删除

"use strict";
var x;
delete x; //语法错误
var o = Object.create(null, {
    "x":{value:1,configurable:true}
});
delete o.x; //删除成功
显式报错

正常模式下,对一个对象的只读属性进行赋值,不会报错,严格模式会

"use strict";
var o = {};
Object.defineProperty(o, {value:1, writable:false});
o.v = 2; //报错

严格模式下,对一个使用getter方法读取的属性进行赋值,会报错

"use strict";
var o ={
    get v(){return 1;}
};
o.v = 2; //报错

严格模式下,对禁止扩展的对象添加新属性,会报错

"use strict";
var o ={};
Object.preventExtensions(o);
o.v = 2; //报错        
重名错误 对象不能有重名的属性
"use strict";
var o = {
    p:1,
    p:2
};//语法错误
函数不能有重名的参数
"use strict";
function f(a, a, b) { // 语法错误
    return ;
}
禁止八进制对法

正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。

"use strict";
var n = 0100; // 语法错误
arguments对象的限制 不允许对arguments赋值
"use strict";
arguments++;//错误
var obj = { set p(arguments) { } }; // 语法错误
try { } catch (arguments) { } // 语法错误
function arguments() { } // 语法错误
var f = new Function("arguments", ""use strict"; return 17;"); // 语法错误    
arguments不再跟踪参数的变化
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]
禁止使用arguments.callee

无法在匿名函数内部调用自身

"use strict";
var f = function(){ return arguments.callee;};
f(); //报错
函数必须声明在顶层
"use strict";
 if (true) {
   function f() { } // 语法错误
 }
 for (var i = 0; i < 5; i++) {
     function f2() { } // 语法错误
 }
保留字

新增的一些保留字:implements, interface, let, package, private, protected, public, static, yield

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80633.html

相关文章

  • JavaScript“use strict”

    摘要:在严格模式中,当运算符后跟随非法的标识符比如变量函数函数参数时,将会抛出一个语法错误异常在非严格模式中,这种表达式什么也没做,并返回。 JavaScript之use strict use strict是ECMAScript 5引入的一条指令。指令不是语句(但非常接近于语句)。usestrict指令和普通的语句之间有两个重要的区别: 它不包含任何语言的关键字,指令仅仅是一个包含一个特殊...

    econi 评论0 收藏0
  • JavaScript】面向对象严格模式

    摘要:一严格模式概述严格模式是什么在中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差异严格模式和非严格模式可共存,可选择性的加入严格模式严格模式的目的将把陷阱直接变为明显错误修正一些引擎难以优化错误,代码有些时候严格模式会比非严 JS(JavaScript)一.严格模式1.概述 严格模式是什么 在JS中是种限制性更强变种方式,不是个子集,在语义上与正常代码有明显得差异严格模...

    siberiawolf 评论0 收藏0
  • JS专题严格模式

    摘要:整个脚本文件就会以严格模式执行。函数作用域范围将放在函数体的第一行,则整个函数以严格模式运行。严格模式下,必须指明的指向对象。禁止在非函数代码块声明函数的严格模式只允许在全局作用域或函数作用域声明函数。 ECMAScript 5 引入了 strict mode ,现在已经被大多浏览器实现(从IE10开始) 一、什么是严格模式 顾名思义,JavaScript 严格模式就是让 JS 代码以...

    baukh789 评论0 收藏0
  • JavaScript 面向对象 [ 严格模式 ]

    摘要:严格模式描述严格模式可以分别作用在全局作用域中和函数作用域中严格模式是对代码的一种限制方式严格模式可以将不明确显示的错误转变成明确显示严格模式可以修正一些解释器难以优化的错误严格模式下的变量禁止意外创建变量没有开启严格模式时在调用该变量时, 严格模式 描述 严格模式可以分别作用在全局作用域中和函数作用域中 严格模式是对JavaScript代码的一种限制方式 严格模式可以将不明确显...

    zsirfs 评论0 收藏0
  • javascript严格模式

    摘要:概述的严格模式是中的一种限制性更强的变种方式。严格模式在语义上与正常的有一些不同。首先,严格模式会将陷阱直接变成明显的错误。严格模式禁止删除声明变量。 概述 ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样, 所以不要在未经严格模式特...

    Chao 评论0 收藏0

发表评论

0条评论

zoomdong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<