为什么使用严格的'通常在IIFE之后(而不是在脚本的顶部)?

时间:2016-07-30 06:04:25

标签: javascript

我有点注意到use strict似乎更常见:

(function() {
  'use strict';
  ...

比这个:

'use strict';
(function() {
  ...

vanilla JS implementation of TodoMVC就是这样做的。

这是否有原因?

编辑:我意识到整个文件与功能块的区别。 TodoMVC就是一个很好的例子来说明为什么这个位置对我来说很奇怪,因为它不依赖于任何外部库,所以整个"与非严格的第三方玩得很好"不适用于此。

4 个答案:

答案 0 :(得分:7)

local范围内声明它将强制要求浏览器在strict-mode下考虑功能块。

您可以对non-strict

之外的其他代码进行IIFE观察

内部IIFE



(function() {
  "use strict";
  a = 100;
})();
b = 200;




对于整个脚本:



"use strict";
(function() {
  try {
    a = 100;
  } catch (e) {
    console.log(e + '');
  }

})();
b = 200;




正如docs中所强调的那样,

  

如果您对整个脚本使用strict模式,则无法盲目连接非冲突脚本。考虑将严格模式脚本与非严格模式脚本连接起来:整个连接看起来很严格!反之亦然:非严格加严格看起来非严格。严格模式脚本相互连接很好,非严格模式脚本的连接也很好。只连接严格和非严格的脚本是有问题的。因此,建议您逐个功能地启用严格模式(至少在过渡期间)。

     

您还可以采用在函数中包装脚本的全部内容并使该外部函数使用严格模式的方法。这消除了连接问题,但这意味着您必须显式地从函数范围中导出任何全局变量。

答案 1 :(得分:3)

我猜测它是因为即使多个JS文件作为构建步骤连接在一起(即允许组织代码而没有多个HTTP请求的性能损失),该放置肯定会启用严格模式。将"use strict"放置在文件的开头,这些文件可能会出现问题:

foo.js
function doThing() {
    console.log("done");
}
main.js
"use strict";

(function() {
    document.getElementById('thingy').addEventListener("click", doThing);
})();

如果上述文件首先与foo.js连接,"use strict"内的main.js将无法生效。将"use strict"置于函数内部可以避免这种可能性。

我不知道JS的连接是多么常见,我不知道较新的{​​{1}}方法或require关键字是否允许您将import放在任何您想要的位置,但也许在函数中放置"use strict",而简单的连接很受欢迎,人们在使用它之后没有理由改变约定。

答案 2 :(得分:2)

如果您使用:

let container = CKContainer.defaultContainer()

container.fetchUserRecordIDWithCompletionHandler { (recordId, error) in
    if error != nil {
      print("Handle error)")
 }else{                                                                        

self.container.discoverUserInfoWithUserRecordID(
        recordId!, completionHandler: { (userInfo, error) in
            if error != nil {
                print("Handle error")
            }else{
                if let userInfo = userInfo {
                    print("givenName =   \(userInfo.displayContact?.givenName)")
                    print("familyName = \(userInfo.displayContact?.familyName)")
                }else{
                    print("no user info")
                }
            }
          })
         }
        }

它会将'use strict'; (function() { ... 模式应用于所有文件。

相反,当你在这样的函数中使用use strict时:

use strict

如果你必须混合旧代码和新代码,这可能会有所帮助。

答案 3 :(得分:0)

为何选择严格模式

从语言设计的角度来看,严格模式消除了某些被认为不太理想的允许语言解析和执行特征。这些非严格模式语言特性被认为是向后兼容的默认行为。概要和细节出现在这里。

当Netscape早期的这些旧语言特性被弃用或者某些时候严格模式是否会成为浏览器的默认行为时,并没有明确定义,但更严格的模型可能会产生更少模糊和风险的来源。如果您希望提高编码实践和代码库的可维护性,可移植性和可扩展性,那么严格模式是一个不错的选择。

<强>语法

“use strict”;

声明范围

范围取决于您是将声明置于函数内部还是函数外部,并且适用于闭包范围内声明之后的所有语句。

如果所有文件或流已经与更严格的模式兼容或者可以轻松地使用,则在函数内部使用声明是错误的方法。冗余是不必要的,因此建议使用声明放在文件顶部或流的开头。

有时只有部分功能符合更严格的规则。在这种情况下,声明的不太理想的功能范围可用于鼓励更精细的编码实践,至少在已经遵守的功能中。

注意对于那些来自"What's the benefit of using "function() 'use strict'” in every file?"

的人

你可以放置

"use strict";

位于代码序列的顶部或函数内部,因此每个文件或每个函数只有一行代码。

其他代码行在代码here中有其他用途。

  • 自我调用功能
  • 工厂调用