Javascript范围 - 包括不传递或制作全局

Rst*_*voa 3 javascript parameters scope function

我正在为一组函数编写一些脚本,这些函数都通过一次调用操作并获取大量参数来返回一个值.主要功能需要使用11个需要使用相同参数的其他功能.我的结构有点像这样:

function mainfunction(param1, param2, ..., param16)
{
    //do a bunch of stuff with the parameters
    return output;
}

function secondaryfunction1()
{
    //gets called by mainfunction
    //does a bunch of stuff with the parameters from mainfunction
}
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来使传递给main函数的参数可用于所有辅助函数而不传递它们或使它们成为全局变量?如果没有,那很好,我会把它们作为参数传递 - 我很好奇我是否可以更优雅地做到这一点.

Igo*_*gor 8

你可以把secondaryfunction1里面的定义mainfunction:

function mainfunction(param1, param2, ..., param16){
    function secondaryfunction1() {
     // use param1, param2, ..., param16
    }
    secondaryfunction1();
}
Run Code Online (Sandbox Code Playgroud)

更新:

正如@dystroy指出的那样,如果您不需要在secondaryfunction1其他地方打电话,这是可行的.在这种情况下,参数列表将来自哪里 - 我不知道.


Den*_*ret 5

您可以使用arguments传递给secondaryFunction1所有参数mainfunction.但这很愚蠢.

你应该做什么,以及通常做什么,将所有参数嵌入"options"对象:

function mainfunction(options){
    secondaryfunction1(options);
}

function secondaryfunction1(options) {
     // use options.param1, etc.
}

// let's call it
mainfunction({param1: 0, param2: "yes?"});
Run Code Online (Sandbox Code Playgroud)

这有其他优点,比如

  • 命名您传递的参数,维护必须计算参数以了解要更改的参数并不是一件好事.没有理智的库可以让你传递16个参数作为函数的直接未命名参数
  • 使您只能传递所需的参数(其他参数是默认值)

  • @pseudosavant这**是通常和正确的解决方案.例如,您可能会在需要大量参数的所有jQuery函数中找到它. (2认同)