自执行函数在IE的严格模式下是否有效?

4
我测试了以下代码:
$(function () {
    "use strict"
    (function () {
        console.log("something");
    }());
});

但是在IE中运行时,我一直收到异常:“需要函数”。在Firefox中这个没问题。这似乎是基本功能。我做错了什么?


5
只是出于好奇,将“use strict”字符串后面加上分号有帮助吗?(另外,您确定已经导入了jQuery吗?) - Pointy
我不确定这是否会有所不同,但我总是使用不同的语法来实现这个。(function () {})() - Brad
哦,分号的问题解决了。将其作为答案发布(如果可能的话,请说明为什么它有效)。 - sircodesalot
3
你的代码被解释为"blah"(function () {}());,也就是说,你试图将字符串"blah"作为函数执行,并将IIFE(即(function(){})())的返回值(即undefined)作为参数传递。请注意保持翻译后的句子意思不变,尽可能让它更加通俗易懂。 - Matt
在Firefox 22中,对我来说它会抛出错误TypeError: "use strict" is not a function。在Chrome中也是如此。所以这不是IE的问题。 - Felix Kling
显示剩余2条评论
1个回答

5
自动分号插入规则非常奇怪。关于是否编写利用此功能的代码存在争议,所以我不会深入讨论这个问题,但在这种情况下,解析器认为您可能正在尝试调用一个函数。在字符串后添加分号应该可以解决这个问题。
另外,您可以尝试以下方法:
$(function () {
    "use strict"
    !function () {
        console.log("something");
    }();
});

(个人意见,我只会加上分号 :-))

有什么想法为什么这在Firefox中可以工作而在IE中不行吗?这种行为不应该在规范中明确指定吗? - Matt
1
@FelixKling,啊。我猜OP对它在Firefox中工作的错误理解可能是为什么它在Firefox中“工作”但在IE中不工作的另一个原因。 - Matt
我刚刚又运行了一遍,在Firefox(V 20.0.1)中可以正常工作。 - sircodesalot
另外,"!"代表什么意思? - sircodesalot
1
@sircodesalot:这是一元布尔非运算符。!false返回true,反之亦然。在这种情况下,它具有与您最初拥有的括号相同的目的:将函数定义视为函数表达式(而不是函数声明)。但与括号不同的是,它不能被错误地解释为函数调用。可以使用任何其他一元运算符,例如+typeof。运算符并不重要,只有它对代码如何被解释产生的影响才重要。 - Felix Kling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接