1

使用首先检查是否已定义的函数在任何 Webkit 浏览器下都会出现问题。有时我使用 js 模块 A 中的函数,而在另一个应用程序中,我想使用模块 B 中具有相同名称(但代码略有不同)的相同函数。我通过 typeof 运算符解决了这个问题,以检查它是否“未定义”。下面的示例(为了清楚起见,所有内容都在一个文件中)显示了我的工作。

<!DOCTYPE html>
<html>
<head>
<title>Javascript function definition test</title>
<script type="text/javascript">

// actually in module A.js
function foo()
{
  alert("This is the first function.");
}

// actually in module B.js

if (typeof(foo)=="undefined") {
function foo()
{
  alert("This is the second function when foo() is undefined.");
}

}
// This definition SHOULD be ignored in all cases but Webkit does run this despite the if (false) !!

if (false) {
function foo()
{
  alert("This is the third function when foo() is defined within if (false).");
}

}

</script>
</head>
<body>
<script type="text/javascript">
foo();
</script>
</body>
</html>

我发现在 Chrome (android 和 OSX)、Boat Browser (Android)、Safari (OSX) 中总是调用最后一个定义的函数,尽管它在 if (false) 条件之间被禁用。当删除它时,尽管该函数已在前面定义,但仍会调用 typeof "undefined" 之间的第二个定义。

在 Firefox (OSX, Android) 下,它正确调用了第一个函数。

这是 Webkit 引擎中的错误还是我忽略了什么?

4

3 回答 3

1

它在某些浏览器中工作是一种侥幸,但由于您认为的原因,它没有工作。

函数定义是“提升的”,因此函数在作用域内时可用,而不是在定义位置时可用。

例如,这是合法的

a();
function a() {
}

因为在评估中,函数定义被提升到顶部并变为

function a() {
}
a();

相反,请执行以下操作:

if(window.foo === undefined) {
    window.foo = function() {
        alert("This is the second function when foo() is undefined.");
    }
}
于 2013-11-03T07:27:02.910 回答
1

正如 Paul Draper 的回复中提到的,函数定义被提升到范围的顶部。

您可以通过像这样声明您的函数来解决您的问题:

var foo;

foo = function ()
{
  alert("This is the first function.");
}

// actually in module B.js

if (typeof(foo)=="undefined") {
  foo = function ()
  {
    alert("This is the second function when foo() is undefined.");
  }
}
// This definition SHOULD be ignored in all cases but Webkit does run this despite the if (false) !!

if (false) {
  foo = function ()
  {
    alert("This is the third function when foo() is defined within if (false).");
  }
}
于 2013-11-03T07:32:15.027 回答
0

指令函数 name() 表示您在窗口范围内声明函数。您需要将您的函数链接到某个变量。

var myFunc=function(){ alert(1);};
if (true){
  myFunc=function(){alert(2);}
}
if (false){
  myFunc=function(){alert(3);}
}
myFunc();

警报 2 将触发。

于 2013-11-03T07:29:17.277 回答