Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何拥有默认参数并覆盖此函数中所需的参数?_Javascript_Jquery_Closures_Parameter Passing_Iife - Fatal编程技术网

Javascript 如何拥有默认参数并覆盖此函数中所需的参数?

Javascript 如何拥有默认参数并覆盖此函数中所需的参数?,javascript,jquery,closures,parameter-passing,iife,Javascript,Jquery,Closures,Parameter Passing,Iife,我正在编写其他一些开发人员的代码,我注意到在一些JavaScript文件中使用了以下模式 var my_team = function() { var handleTeam = function() { //do some ajax // and update selected DOM element } return { //main function to initiate the module ini

我正在编写其他一些开发人员的代码,我注意到在一些JavaScript文件中使用了以下模式

var my_team = function() {
    var handleTeam = function() {
        //do some ajax 
        // and update selected DOM element
    }
    return {
        //main function to initiate the module
        init: function() {
            handleTeam();
        }
    };
}();

jQuery(document).ready(function() {
    my_team.init();
});
我处于JS开发的初级阶段,正在学习最佳实践。我认为上面的方法叫做闭包?对吗

我努力实现的目标是:

<select name="players" id="player">
    <option>Mark</option>
    <option>Tom</option>
</select>
<select name="coaches" id="coach">
    <option>Mark</option>
    <option>Tom</option>
</select>
这似乎不是最好的方法,因为我以后将无法传递额外的
参数
,除非我更改上面的代码以接受上面列表中的更多
参数

我的主要目标是使此功能可在其他页面上重复使用,在这些页面上,我可以根据需要选择默认值或传递任何
参数

如何使其具有默认的
参数
,并根据需要从任何页面覆盖这些参数

我认为上面的方法叫做闭包?对吗

是的,OPs代码段中的模式是,它也是


当您询问最佳实践时,我做了一些细微的更改来回答这个问题。因此,我实现了什么并不重要,更重要的是我是如何实现的(参见内联注释)

如果我没弄错的话,您希望实现这样的目标(为了便于说明,还向函数体添加了一些内容):

var myTeam=(函数(\u sDefault,\u oDefault){//my\u team vs.myTeam?JS的命名约定是CAMELLECASE!
//变量名前加下划线或后加下划线通常用于表示变量具有私有访问权限
var _handleTeam=功能(sDefault、oDefault){
console.log(sDefault);
控制台日志(oDefault);
//“无法调用”/“无权访问”init()或updatePlayer()
}
返回{///部署公共方法
初始化:函数(sDefault、oDefault){
如果(!sDefault)sDefault=_sDefault;//devs write:sDefault=_sDefault | | sDefault;
如果(!oDefault)oDefault=\u oDefault;
_handleTeam(SDEFULT、ODEFULT);
},
updatePlayer:function(){
log('updatePlayer');
}
};
})('default',{default:true});//在生活中传递价值观
myTeam.init();//使用默认值启动
init('custom',{default:false,custom:true});//使用自定义值初始化
myTeam.init();//使用默认值再次启动

myTeam.updatePlayer()初始化团队时,不会对填充团队产生任何影响。也许你应该扩展它,这样你就可以向团队中添加成员了?我不确定您是否遗漏了一些内容,但必须有更多与该对象相关的属性。这是新设置,因此一旦我知道如何传递param1和param2,我将编写其他代码。目前我有单独的函数,比如函数team(param1,param2){}我直接调用它们,就像team(“player_id”,“coach_id”)@不知道init:handletem有什么问题?不确定你的意思?你可以传递一个对象(例如,
{param1:'someValue',param2:'otherValue'}
)。这是一个很好的答案,我喜欢你的代码注释和解释。感谢您抽出时间分享您的知识和想法。我一定能够在此基础上再接再厉。干杯感谢您@NoNice:)@NoNice顺便说一句:我在对象上使用
jQuery.extend
的原因很清楚?是的,我看过jQuery的创建插件指南,我确信我理解这个概念@NoNice的资源确实非常非常好,但没有理解我的意思。我说的是将对象作为参数传递。JS中有一个非常特殊的行为。请看一下我编辑过的答案的底部。编辑以“注意具有<代码>类型<代码>对象<代码>的参数”开始。我记得当我开始写插件时,这实际上花了我几个小时。希望我能使你免于头痛。现在让我告诉你是否值得一读。。。
init: function(param1, param2) {
    handleTeam(param1, param2);
}