Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:将命名函数分配给变量(命名函数表达式)时不一致_Javascript_Internet Explorer_Firefox_Cross Browser - Fatal编程技术网

Javascript:将命名函数分配给变量(命名函数表达式)时不一致

Javascript:将命名函数分配给变量(命名函数表达式)时不一致,javascript,internet-explorer,firefox,cross-browser,Javascript,Internet Explorer,Firefox,Cross Browser,有谁能解释一下Internet Explorer和Firefox在以下方面的行为差异: var myNamespace = (function () { var exposed = {}; exposed.myFunction = function myFunction () { return "Works!"; } console.log(myFunction()); // IE: "Works!" // Firefox: ReferenceError:

有谁能解释一下Internet Explorer和Firefox在以下方面的行为差异:

var myNamespace = (function () {
  var exposed = {};

  exposed.myFunction = function myFunction () {
    return "Works!";
  }

  console.log(myFunction()); 
  // IE: "Works!"
  // Firefox: ReferenceError: myFunction is not defined

  console.log(exposed.myFunction());
  // IE: "Works!"
  // FF: "Works!"

  return exposed;
})();

console.log(myNamespace.myFunction()); 
// IE: "Works!"
// FF: "Works!"
在internet explorer中,此方法允许我使用
myFunction()
exposed.myFunction()
从命名空间函数内部调用函数

在我的namespace函数之外,我可以使用
myNamespace.myFunction()

在Firefox中,结果是相同的,只是裸命名函数调用不起作用

它应该起作用吗?如果不应该,那为什么不呢

如果应该,那么这是一个已知的错误吗?

这是:

exposed.myFunction = function myFunction () {
    return "Works!";
}
是无用的(纠正我自己:这是正确的),显然是有缺陷的(见Felix的帖子)。如果要声明已公开的
的函数部分
,则无需命名:

exposed.myFunction = function() {
    return "Works!";
}
但是,如果您想声明一个本地函数,然后将其影响到您的数组
exposed
,则可以执行以下操作:

function myFunction () {
    return "Works!";
}

exposed.myFunction = myFunction;
在本例中,它将成功验证
(exposed.myFunction==myFunction)==true


另外,请注意对
console.log(myNamespace.myFunction())的调用
与对
console.log(exposed.myFunction())的调用相同
因为
myNamespace
实际上是公开的对象

以防止错误信息:

IE在命名函数表达式方面存在问题,而这正是您的问题所在。函数名称应仅在函数内部可用。从:

FunctionExpression中的标识符可以从FunctionExpression的FunctionBody内部引用,以允许函数递归调用自身。但是,与FunctionDeclaration不同,FunctionExpression中的标识符不能从中引用,也不会影响包含FunctionExpression的范围

其中FunctionExpression定义为:

函数表达式:
函数
Identifieropt
FormalParameterListopt)
{
FunctionBody
}

但在IE中,它创建了两个不同的函数对象,一个指定给变量,另一个指定给函数的名称,而不是使名称仅在函数内部可用。以下内容将在IE中产生
false
(并在其他浏览器中引发错误):

这是一个已知的bug,如果您必须为(旧版本的)IE编写代码,最好避免命名函数表达式


相关问题:

    • 同样,通过定义

      exposed.myFunction = function() {}
      
      exposed.myFunction = function myFunction() {}
      
      您正在将
      exposed
      的属性设置为
      myFunction

      而且它在
      myNamespace
      范围中不可用

      通过定义

      exposed.myFunction = function() {}
      
      exposed.myFunction = function myFunction() {}
      

      该函数在
      myNamespace
      的范围内创建,然后作为
      exposed

      的属性引用。这可能会回答您的问题:,.tl;dr:不,它不应该工作,这是IE中的一个缺陷。OT:不要给数组分配任意属性,只使用数字属性名。如果要指定任意属性,请改用对象。看,同意。我把它改成了一个物体,本来就是要放在第一位的,这是正确的。这是一个命名的函数表达式,完全有效的JavaScript。那么firefox应该允许执行
      console.log(myFunction()),否则会出现不一致。不,IE应该正确实现JavaScript。我的意思是,如果你说第一个表达式是正确的,那么这意味着在当前上下文中应该考虑裸
      myFunction
      的声明,因此应该按原样调用。但函数表达式不是这样定义的。看看我的答案,太棒了!这完美地解释了为什么上面的代码在IE中“有效”,而不是在Firefox中。当然,Firefox中的行为不是我所执行的,而是符合规范,这才是重要的,是对本地函数的调用,根据您的规范,该函数应该存在。(在本文中,FunctionBody是
      公开的
      的最近信封,正是进行裸调用的地方)@Sebas:不,我们谈论的是FunctionExpression的FunctionBody,而不是它在其中定义的FunctionBody。也许你还没有看到我的更新。根据说明书,它不应该存在。我理解你的观点。也许我的解释是错误的,但对我来说,这里有一个问题,因为我们谈论的是声明函数及其相关范围(我100%同意你的文章),而实际上存在着重叠函数的矫揉造作。请参阅我的帖子:函数的声明肯定在
      exposed
      的主体之外,尽管之后,它作为一个属性受到影响。但也许我误解了引擎。@Sebas:老实说,我听不懂你最后的评论。目前的问题是IE在定义函数的范围内创建了一个带有函数表达式名称的符号,这是错误的。其他一切都无关紧要。