什么是JavaScript严格模式?

原文 标签 IT工具网 javascript

原问题:What does “use strict” do in JavaScript?

Strict Mode是ECMAScript5引入的一个新特性。使用它能使得你的程序或者函数运行在严格的环境中。这个严格的运行环境能预防一些危险操作,并会给出异常信息。 - 捕获一些常见的编程陷阱 - 阻止一些危险操作的发生(比如存取全局对象) - 禁用了JavaScript中的一些让你迷惑或易发生错误的特性

使用Strict Mode

它是一个声明式的语句,语句本身就是"use strict"这个字符串。

Strict Mode有其应用范围。

如果你想对整个JavaScript文件应用它,那么就把它放在文件第一行:

"use strict";
// ... your code ...

你也可以只在某个函数上应用它:

// Non-strict code...

function(){
  "use strict";
  // ... your code ...
}

// Non-strict code...

为了避免污染全局变量,很多library都以self-excuting function的形式来定义。对于这些library,仍然可以应用Strict Mode:

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

总的来说,use strict是JavaScript为开发者提供的一个代码检查工具。它能在指定范围内检查你的代码,让你避免犯那些常见的JavaScript错误和陷阱。

注意:Strict Mode并没有引入新的语法,你仍然可以对以前的代码使用它。

哪些地方变严格?

jQuery的作者John Resig对此总结的不错,此部分内容来自他的文章:ECMAScript 5 Strict Mode, JSON, and More

  • 变量必须先声明,再使用 function test(){ "use strict"; foo = 'bar'; // Error }

  • 不能对变量执行delete操作

    var foo = "test";
    function test(){}
    delete foo; // Error
    delete test; // Error
    function test2(arg) {
    delete arg; // Error
    }
    
  • 对象的属性名不能重复

    { foo: true, foo: false } // Error
    
  • 禁用eval()

  • 函数的arguments参数

    • 不能修改arguments
    • 不能在函数内定义arguments变量
    • 不能使用arugment.callerargument.callee。因此如果你要引用匿名函数,需要对匿名函数命名。比如: setTimeout(function later(){ // do stuff... setTimeout( later, 1000 ); }, 1000 );
    • 禁用with(){}

浏览器支持

如果浏览器不支持use strict,会当它是普通的JavaScript语句:定义一个字符串但没有被引用。因此对其他代码没有任何影响。

当前浏览器对use strict的支持情况: ECMAScript 5 Strict Mode Supported by Browsers

题外话

实际上,现在大家在项目中大多都使用了JSHint,就不需要在多个地方声明use strict了。 如果你还没用过JSHint,请参考JSHint Documentation

相关文章:

基于发号器构建的短网址系统

php - WP Oembed没有通过 “autoplay=1”变量

javascript - 如何使<div>消失然后重新出现在onclick上

javascript - 如果发生分页,onclick不会发生

javascript - 防止 map 重复,并在世界范围内不断拖动

Java修饰符:public,protected,private,不加修饰符。有什么区别呢?

JavaScript的参数传递方式:传值or传引用

java 产生指定范围的随机数

Javascript 委托(delegate)最佳实践