Skip to content

Latest commit

 

History

History
83 lines (69 loc) · 2.75 KB

know-which-javascript-you-are-using.md

File metadata and controls

83 lines (69 loc) · 2.75 KB

知道你现在使用的是哪种模式的JavaScript

  • 在严格模式下,在函数中重复声明arguments会报错:

    'use strict';
    function say() {
        var arguments = []; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
    }

    源码

  • 在非严格模式下,在函数中重复声明arguments不会报错:

    function sayWithNoStrict() {
        var arguments = [];
    }

    源码

  • 如果连接两个不同模式的JavaScript文件的话,如果是严格模式的文件放在开始的话,那么整个文件都是处于严格模式的:

    // file1.js
    'use strict';
    function say() {
        var arguments = []; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
    }
    
    // file2.js
    function sayWithNoStrict() {
        var arguments = []; // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
    }

    源码

  • 如果连接两个不同模式的JavaScript文件的话,如果是非严格模式的文件放在开始的话,那么整个文件都是处于非严格模式的:

    // file2.js
    function sayWithNoStrict() {
        var arguments = [];
    }
    
    // file1.js
    'use strict';
    function say() {
        var arguments = [];
    }

    源码

  • 因为file1.jsfile2.js如果合并到一个文件中的话,那么它们处于同一个作用域中; 这个时候如果在文件的顶部使用use strict的话,那么整个文件都是使用的严格模式; 在文件中间使用use strict是没有作用的。

  • 我们当然也有应对这种情况的解决方案,那就是使用一个立即调用的函数来包裹我们的代码; 达到分离作用域的目的,然后在这个立即执行的函数上方标注我们要使用的模式;如果你想使用严格模式的话, 那就添加use strict;如果不想使用严格模式的话,那就什么也不添加。

    (function() {
        // file1.js 使用了严格模式
        'use strict';
        function say() {
    
        }
    })();
    
    (function() {
        // file2.js 使用非严格模式
        function sayWithNoStrict() {
            var arguments = [];
        }
    })();

    源码


谨记

  • 决定你的应用程序支持JavaScript的那些版本。
  • 确保你使用的任何JavaScript的特性对于应用程序将要运行的所有环境都是支持的。
  • 总是在执行严格模式检查的环境中测试严格代码。
  • 当心连接那些在不同严格模式下有不同预期的脚本。