0

在移动网站中,我有一些 JavaScript 代码,如下所示:

<script type="text/javascript">
(function() {
  // function body omitted
}());
</script>

第一次加载页面时执行代码,但是如果我回到上一页,然后再次加载此页面,则不会执行第二次。这只发生在页面加载到带有 User-Agent 标头的老式 Android 浏览器上时:

Mozilla/5.0 (Linux; U; Android 2.2.1; en-gb; GT-S5570 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

在较新的 Android 手机上,带有 User-Agent 标头:

Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19

每次加载页面时都会执行代码。这是旧版浏览器的已知问题吗?顺便说一句,两者之间到底有什么区别

(function() {
  // function body omitted
}());

function() {
  // function body omitted
}();
4

1 回答 1

1

至少要回答第二个问题,因为我一直看到人们使用这样的函数表达式

(function () {...}())

有 2 (3) 种类型的功能:

  • 函数声明
  • 函数表达式
  • 函数语句

不能直接调用函数声明。但是可以调用作为表达式结果的函数。

语法正确的立即调用函数表达式看起来像

(function() {
  // function body omitted
})();

在这种情况下,该函数通过将其括在括号中然后被调用而成为一个表达式。然而

(function() {
  // function body omitted
}());

也可以工作,因为分组运算符(放在函数周围,这会自动使其成为函数表达式(可调用),因此您可以通过将 a()直接放在函数体之后来调用函数

但这似乎误导了人们,结构像

function() {
  // function body omitted
}();

也是有效的,但情况并非如此,因为缺少分组运算符没有告诉解释器它的表达式。因此它一直是一个函数声明,不能直接调用。

这是一篇很好的文章,它很好地解释了这 3 种类型

于 2013-01-08T13:00:00.393 回答