我的功能要么没有正确宣布,要么在正确的地方宣布,“使用严格”。

时间:2014-10-19 23:32:10

标签: javascript function jslint

我一直在我的代码上使用JSLint,而我的代码的这部分我只是想不通... JSLint给了我以下消息:

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

并且该消息暗示了以下功能:

函数callbackRed(){

函数callMIDRed(){

我已经尝试将它们分配给变量,并将它们放在函数顶部的变量中(turnEvent)......但它只是看起来更丑陋而且当我尝试它时它不起作用...(也许我把代码叫错了。

function turnEvent(x, y) {
    "use strict";
    var kassi = collides(rects, x, y);
    if (kassi) {
        context.fillStyle = "White";
        context.fillRect(kassi.x, kassi.y, 90, 110);
        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);
        }
        setTimeout(function displayRectRed() {
            context.fillStyle = kassi.color;
            context.fillRect(kassi.x + 35, kassi.y + 35, 20, 40);
            return callMIDRed();
        }, 50);
    }
}//turnEvent();

2 个答案:

答案 0 :(得分:1)

相关阻止是您的if阻止。

由于某些内容被称为variable hoisting,因此不建议在if块(或forwhile或{中声明变量{1}}就此问题而言),因为它可以让你认为你的变量只在那个区块中可见,而且它是错误的。碰巧,函数语句的结果之一就是声明一个变量。

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

if

答案 1 :(得分:0)

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

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

if (true) {
  function foo() {alert('foo')}
} else {
  function foo() {alert('Not foo')}    
}

在上面,一个不支持函数语句的浏览器(例如IE,Safari)将会看到两个函数声明,第二个函数声明替换第一个,在运行任何代码之前。所以:

foo() // Not foo

但是,在支持函数语句的浏览器(例如Firefox)中,有条件地创建了该函数,并且:

foo() // foo

您可以在Kangax关于Named function expressions demystified: Function statements的文章中找到更多细节。