Javascript 我的函数不是没有正确声明,就是在正确的位置声明。”;使用“严格的”;。

Javascript 我的函数不是没有正确声明,就是在正确的位置声明。”;使用“严格的”;。,javascript,function,jslint,Javascript,Function,Jslint,我一直在我的代码中使用JSLint,这部分代码我就是搞不懂。。。JSLint给了我以下信息: 函数语句不应放在块中。请使用函数表达式或将语句移动到外部函数的顶部 该消息暗示了以下功能: 函数callbackRed(){ 及 函数callMIDRed(){ 我曾尝试将它们分配给变量,甚至将它们放在函数顶部的变量中(turnEvent)……但它看起来更难看,而且在我尝试时不起作用……(可能我调用的代码是错误的) 所讨论的块是您的if块 由于调用了某些内容,不鼓励在if块中声明变量(或for,或whi

我一直在我的代码中使用JSLint,这部分代码我就是搞不懂。。。JSLint给了我以下信息:

函数语句不应放在块中。请使用函数表达式或将语句移动到外部函数的顶部

该消息暗示了以下功能:

函数callbackRed(){

函数callMIDRed(){

我曾尝试将它们分配给变量,甚至将它们放在函数顶部的变量中(turnEvent)……但它看起来更难看,而且在我尝试时不起作用……(可能我调用的代码是错误的)


所讨论的块是您的
if

由于调用了某些内容,不鼓励在
if
块中声明变量(或
for
,或
while
,或
else
),因为它会让您认为您的变量只在该块中可见,这是错误的。事实上,函数语句的后果之一就是声明变量

在您的情况下,解决方案是将这些函数声明移到
if
块之外:

function turnEvent(x, y) {
  "use strict";
  var kassi = collides(rects, x, y);
  function callbackRed() {
    setTimeout(function returnSizeRed() {
      context.fillStyle = kassi.color;
      context.fillRect(kassi.x, kassi.y, 90, 110);
    }, 50);
  }
  function callMIDRed() {
    setTimeout(function displayMidRed() {
      context.fillStyle = kassi.color;
      context.fillRect(kassi.x + 12, kassi.y + 12, 60, 80);
      return callbackRed();
    }, 50);
  }

  if (kassi) {
    context.fillStyle = "White";
    context.fillRect(kassi.x, kassi.y, 90, 110);
    setTimeout(function displayRectRed() {
      context.fillStyle = kassi.color;
      context.fillRect(kassi.x + 35, kassi.y + 35, 20, 40);
      return callMIDRed();
    }, 50);
  }
}//turnEvent();

不使用函数语句的原因是它们只受少数浏览器的支持,并且在不同的浏览器中会导致非常不同的结果

主题ECMA-262定义了FunctionDeclaration和FunctionExpression。function语句是Mozilla引入的语言的扩展,并非所有浏览器都支持。function语句似乎是不支持语句的浏览器中的函数声明,例如:

if (true) {
  function foo() {alert('foo')}
} else {
  function foo() {alert('Not foo')}    
}
在上述情况下,不支持函数语句(例如IE、Safari)的浏览器将在运行任何代码之前看到两个函数声明,第二个函数声明将替换第一个函数声明。因此:

foo() // Not foo
但是,在支持函数语句的浏览器(如Firefox)中,函数是有条件创建的,并且:

foo() // foo

你会在Kangax关于的文章中找到更多的细节。

打它一顿,然后不吃晚饭就把它送到床上。(另外,把它们从
if
块中拿出来。)我想很多人会问你的问题是,“你为什么在其中声明函数?”@esqew还有什么可使用的?我能够调用4行特定代码,并按特定顺序运行这3个函数。我不知道。将函数从
if
块中取出。瞧,严格的。
if
没有作用域,所以它们是否在
if
中执行并不重要。
@esqew
,很好在JavaScript中把函数放在彼此的内部。不确定你为什么得到了分数。你关于为什么应该避免函数语句的推理是不正确的。函数语句是规范的扩展,只在少数浏览器中受支持。因此,在不同的浏览器中使用它们会产生不同的结果。请参阅。我已经阅读了你的链接和我不明白这怎么会使推理不正确,对我来说,它只是增加了它,你能详细说明一下吗?因为不使用函数语句不是“提升”,这是关于在不同浏览器中的不同结果。在Firefox中,callbackRed和callMIDRed是有条件创建的。我同意这是一个问题,但显然这不是JSlint抱怨的问题:“函数语句不应该放在块中。使用函数表达式或将语句移动到外部函数的顶部。”。不要告诉我,告诉JSlint:)它位于一个块中,这使它在Firefox中成为函数语句(但在其他浏览器中不是)。将它从块中取出,使它在所有浏览器中都成为函数声明。JSlint说“不要使用函数语句,使用声明或表达式”,这是一个很好的建议。
foo() // foo