在调用 JavaScript 函数时,什么情况下需要使用 ()?

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,但它仍然被调用,我有一种感觉,最好停止函数的调用,而不是让它被调用但没有做任何事情。
谢谢!
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 方法时,同样的情况会发生。这就是为什么括号如此重要的原因。

哦,我明白了。谢谢,所以没有括号它将等于函数的确切写法...为什么你会想这样做呢? - user1159454
传递回调函数是最常见的原因。实际上,正如他所示的例子,您希望为“onload”事件回调执行此操作(每当浏览器触发“onload”事件时,它还会执行存储在“window.onload”中的函数(如果存在))。 - user1207456

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);

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 );
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接