3

所以在之前的问题中,我被告知要调用/执行/启动函数,例如thisFunc;而不是thisFunc();.

而且我发现有时这有效,有时则无效。

<script type='text/javascript'>
var valgo = 0;
var thing = "";
var lastPost = document.getElementById(<? echo $_SESSION['countything']; ?>); 
lastPost.style.opacity = valgo;

function valgogoer(thing){
valgo += .05;
if (lastPost.style.opacity < 1){
lastPost.style.opacity = valgo;
}
}


setInterval(function(){valgogoer(<? echo $_SESSION['countything']; ?>)}, 50);

// Somethings are leftover from when I was messing with it, like the parameter thing.
</script>

在这段代码中(如果它很糟糕,请告诉我),因为我使用 setInterval 来调用一个带参数的函数,我通过研究发现它必须按照上面的方式调用。

所以两个问题

  1. 我什么时候应该在调用函数时使用 () ?

  2. 在上面的代码中,我怎样才能让它在不透明度达到 1 后停止执行该函数。目前它被限制为 1,但它仍在被调用,我有一种感觉最好停止被调用的函数,而不是让它被调用但不做任何事情。

谢谢!

4

3 回答 3

4

当您要调用该函数时,请使用方括号。但如果只是想传递函数的内容,你就不要。例子:

var a = function(){
    return "I'm a function";
}
var b = a;//Equals to function(){return "I'm a function";}
var c = a();//Equals to "I'm a function"

在事件处理程序中,您不使用方括号,因为您必须告诉浏览器才能执行函数的内容。如果你放它们,浏览器会调用函数的返回值,这可能会导致错误:

var a = function(){
    alert("Welcome to my site");
}
window.onload = a();//Wrong, equals to undefined, since the a function doesn't return any value
window.onload = a;//Correct, calls the function a when the event is fired

当您使用函数作为参数调用 setInterval 方法时,也会发生同样的事情。这就是为什么括号如此重要的原因

于 2012-05-19T00:05:03.283 回答
2

thisFunc()当你想调用函数时使用。当您thisFunc希望将函数的引用作为值时使用。

当您的函数没有参数时,您可以将引用用于回调:

function thisFunc() {
  // do something
}

window.setTimeout(thisFunc, 1000);

当您的函数有参数时,您需要将其包装在另一个函数中以使用参数值调用它:

function thisFunc(param1) {
  // do something
}

window.setTimeout(function(){ thisFunc(42); }, 1000);

您当然也可以在函数中包装无参数函数:

function thisFunc() {
  // do something
}

window.setTimeout(function(){ thisFunc(); }, 1000);

您不需要使用匿名函数来包装函数,您可以使用命名函数并获取对其的引用:

function thisFunc(param1) {
  // do something
}

function callFunc() {
  thisFunc(42);
}

window.setTimeout(callFunc, 1000);
于 2012-05-19T00:15:26.307 回答
0

()当您希望另一个函数执行您的函数时使用

function log(arg) { console.log(arg); }

setTimeout(log, 1000) // Logs undefined after 1 second


log("hi"); // logs the String hi

该功能是可重用的,因此您可以自己实际使用它

function logUsingTheLogMethod( callback ) {
    if ( typeof callback === "function" ) {
        callback( "This will log to the console!" );
        callback( log === callback ); // Logs true
    }
}
logUsingTheLogMethod( log );

这是 JS 中的一种常见模式,在方法中使用函数作为回调

假设您有一些计算数学的函数,但您不想为所有函数编写日志记录方法。

function add(a,b,fn) {
    if ( fn === log ) {
       fn( a + b );
    }
}
function subtract(a,b,fn) {
    if ( fn === log ) {
       fn( a - b );
    }
}

add(1, 2, log); // logs 3
subtract(5, 4, log) // logs 1

或修改函数以确保它是函数而不是日志函数,并且您可以对响应执行任何操作

function add(a,b,fn) {
    if ( typeof fn === "function" ) {
       fn( a + b );
    }
}

// answer is automatically passed in by the calling add method
add( a, b, function ( answer ) { 
     // do ssomething with the answer
     alert( answer );
});
于 2012-05-19T00:08:54.253 回答