重新加载页面时不评估JavaScript代码

时间:2013-01-08 12:09:34

标签: javascript android mobile scope

在移动网站上,我有一些看起来像这样的JavaScript代码:

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

我第一次加载页面时会执行代码,但是如果我回到上一页,再次加载此页面,则不会再次执行。只有在旧版Android浏览器上加载User-Agent标题:

时才会发生这种情况
  

Mozilla / 5.0(Linux; U; Android 2.2.1; en-gb; GT-S5570 Build / FROYO)AppleWebKit / 533.1(KHTML,类似Gecko)版本/ 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,与Gecko一样)Chrome / 18.0.1025.166 Mobile Safari / 535.19

每次加载页面时都会执行代码。这是旧版浏览器的已知问题吗?另外,

之间究竟有什么区别
(function() {
  // function body omitted
}());

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

1 个答案:

答案 0 :(得分:1)

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

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

有两(3)种功能:

  • 功能声明
  • 函数表达式
  • 功能陈述

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

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

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

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

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

也可以,因为分组操作符(被放在函数周围,这会自动使它成为函数表达式(可调用)因此你可以通过放置一个函数来调用函数()直接在函数体

之后

但这似乎是误导人,像

这样的结构
function() {
  // function body omitted
}();

也是有效的,但事实并非如此,因为缺少分组操作符而不是告诉解释器它的表达式。因此它一直是一个函数声明,可以直接调用

这是一个很好的Article,它解释了这三种类型非常好