我一直在我的代码上使用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();
答案 0 :(得分:1)
相关阻止是您的if
阻止。
由于某些内容被称为variable hoisting,因此不建议在if
块(或for
或while
或{中声明变量{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的文章中找到更多细节。