立即在严格模式下调用函数表达式

时间:2015-10-29 05:13:45

标签: javascript

在严格模式下我们不能使用Immediately Invoked Function Expressions(IIFE)吗? 以下程序证明我不能在严格模式下使用IIFE。如果我评论'use strict'就行了。这是因为严格模式下的每个表达式都必须有一个名称吗?

'use strict'
(function _test () {
var obj = {`enter code here`
        a:      2,
        b:      'name',
        c:      function _c (){
                console.log('a: ' + this.a + " b: "+ this.b);
        }
};
obj.c();
}) ();

以下是输出

(function _test () {
^
TypeError: string is not a function
    at Object.<anonymous> (/home/ganesh/temp/let.js:2:1)
    at Module._compile (module.js:456:26)
    at Object.Module.`enter code here`_extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:929:3

1 个答案:

答案 0 :(得分:4)

主要问题是use strict后缺少分号。 当JS引擎检查代码的词法结构时,它会看到'use strict',然后是(,因此它需要name()形式的函数。

自动分号插入状态的规则之一:

  

只有在下一个输入令牌不能插入分号时才会插入分号   解析

给出了5个有问题的字符:

(, [, +, -, and /所有 DISABLE 分号插入

如果下一行的语句以这些字符开头且前一行缺少分号,则引擎将两行视为一行,这非常容易出错。

如果删除由SO添加的enter code here部分并在use strict之后添加分号,则一切正常。

'use strict';
(function _test() {
  var obj = {
    a: 2,
    b: 'name',
    c: function _c() {
      console.log('a: ' + this.a + " b: " + this.b);
    }
  };
  obj.c();
})();