在严格模式下我们不能使用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
答案 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();
})();