在JavaScript中传递参数的正确方法是什么?

在JavaScript中传递参数的正确方法是什么?,javascript,setinterval,Javascript,Setinterval,在我的javascript代码中,我有以下内容: function foo(param1) { setInterval( bar(param1), 3000 ); } function bar(msg) { alert(msg); } function set() { foo('hello'); } 在页面加载时,我调用set(),它只给出一次警报消息。为什么它没有像我预期的那样起作用。?我认为问题在于我正在传递foo()函数的参数,但我无法弄清楚它到底是什么 如果

在我的javascript代码中,我有以下内容:

function foo(param1) {
    setInterval( bar(param1), 3000 );
}

function bar(msg) {
    alert(msg);
}

function set() {
    foo('hello');
}
在页面加载时,我调用
set()
,它只给出一次警报消息。为什么它没有像我预期的那样起作用。?我认为问题在于我正在传递
foo()
函数的参数,但我无法弄清楚它到底是什么

如果问题出在参数上,那么实现所需结果的替代方法是什么


谢谢

setInterval
在给出调用整个函数的返回值时,需要一个函数

应能正常工作的修改版本:

var msg = null;

function foo(param1) {
   // When foo is called, its argument is set to msg variable, so the function called 
   // by setInterval will have access to the message that must show in a window.alert
    msg = param1;
    setInterval(bar, 3000 );
}

function bar() {
    alert(msg);
}

function set() {
    foo('hello');
}

setInterval
在给出调用整个函数的返回值时,需要一个函数

应能正常工作的修改版本:

var msg = null;

function foo(param1) {
   // When foo is called, its argument is set to msg variable, so the function called 
   // by setInterval will have access to the message that must show in a window.alert
    msg = param1;
    setInterval(bar, 3000 );
}

function bar() {
    alert(msg);
}

function set() {
    foo('hello');
}
最好的方法是使用从传递给
setInterval
的函数访问参数:

function foo(param1) {
    setInterval(function () {
        bar(param1);
    }, 3000);
}

function bar(msg) {
    alert(msg);
}

function set() {
    foo('hello');
}
最好的方法是使用从传递给
setInterval
的函数访问参数:

function foo(param1) {
    setInterval(function () {
        bar(param1);
    }, 3000);
}

function bar(msg) {
    alert(msg);
}

function set() {
    foo('hello');
}

您需要将函数传递给
setInterval
,您正在执行一个函数并传递它的返回值(
undefined
,因为执行的函数没有返回值)

请尝试改用匿名函数:

function foo(param1) {
    setInterval(function () {
        bar(param1);
    }, 3000);
}

function bar(msg) {
    alert(msg);
}

param1
此处从不更改,因此不需要任何更复杂的内容

您需要将函数传递给
setInterval
,您正在执行函数并传递其返回值(
未定义,因为执行的函数没有返回值)

请尝试改用匿名函数:

function foo(param1) {
    setInterval(function () {
        bar(param1);
    }, 3000);
}

function bar(msg) {
    alert(msg);
}


param1
此处从不更改,因此不需要任何更复杂的内容

对于我每天的迂腐行为,这段代码中没有闭包。根据您链接到的问题:“这不是一个闭包。闭包是当您返回内部函数时。内部函数将在离开之前关闭foo的变量。”@jbabey够公平的了,我被纠正了。:)所以我可以更正答案,从父上下文访问变量的函数的正确术语是什么?@PhilBooth它只是在命名(
foo
)函数声明中声明的匿名函数声明。@jbabey实际上,已经阅读了对该答案的注释,关于这个问题和维基百科上关于闭包的文章的其他答案,我不同意如果函数是闭包,则无需返回该函数,只要该函数在父函数返回后运行并有权访问封闭上下文即可。在这种情况下,它是这样做的。@pratik这种情况很好。思考这个问题的方式是,每次调用
foo
时,您都在定义一个全新的函数,这些函数都可以永久、动态地访问其上下文。在您的案例中,第二次调用
foo
将创建第二个闭包,该闭包访问第二个上下文。需要注意的情况是,您需要在循环体内部定义闭包。在这种情况下,您必须调用循环体外部的函数,修复每个循环迭代的上下文,否则每个闭包将引用单个上下文(终端循环迭代)。对于我每天的迂腐行为,此代码中没有闭包。根据您链接到的问题:“这不是一个闭包。闭包是当您返回内部函数时。内部函数将在离开之前关闭foo的变量。”@jbabey够公平的了,我被纠正了。:)所以我可以更正答案,从父上下文访问变量的函数的正确术语是什么?@PhilBooth它只是在命名(
foo
)函数声明中声明的匿名函数声明。@jbabey实际上,已经阅读了对该答案的注释,关于这个问题和维基百科上关于闭包的文章的其他答案,我不同意如果函数是闭包,则无需返回该函数,只要该函数在父函数返回后运行并有权访问封闭上下文即可。在这种情况下,它是这样做的。@pratik这种情况很好。思考这个问题的方式是,每次调用
foo
时,您都在定义一个全新的函数,这些函数都可以永久、动态地访问其上下文。在您的案例中,第二次调用
foo
将创建第二个闭包,该闭包访问第二个上下文。需要注意的情况是,您需要在循环体内部定义闭包。在这种情况下,您必须在循环体之外调用函数,修复每个循环迭代的上下文,否则每个闭包将引用单个上下文(终端循环迭代)。虽然这将与全局变量一起工作,但我希望
bar(msg)
来准确地提醒我传递给它的参数
msg
的值。@patrik你说得不对。这种方法符合您的要求。另一个讨论是闭包方法更好,但我只是想告诉你你的代码是错误的,以及如何让它工作的基本提示。是的,你的答案是正确的,它完成了任务,但是如果我不想创建全局变量呢。?因此,在这种情况下,我将不得不使用匿名函数方法。@pratik在我的开发人员中,我永远不会使用全局变量。我以为你不能,即使我不想使用全局变量。我应该在问题中更具体地说明这一点。虽然这将适用于全局变量,但我希望
bar(msg)
准确地提醒我传递给它的参数
msg
的值。@patrik你说得不对。这种方法符合您的要求。另一个讨论是闭包方法更好,但我只是想告诉你你的代码是错误的,以及如何让它工作的基本提示。是的,你的答案是正确的,它完成了任务,但是如果我不想创建全局变量呢。?如果是那样的话,我会的