我遇到一个与我遇到的简单Javascript函数有关的令人尴尬的问题:
Passport.prototype.use = function(name, strategy) {
if (!strategy) {
strategy = name;
name = strategy.name;
}
if (!name) throw new Error('authentication strategies must have a name');
this._strategies[name] = strategy;
return this;
};
我相信此功能的目的是给策略一个
name
,覆盖它可能具有的默认名称。考虑到策略未定义
strategy.name
的情况,我相信函数的第一部分实际上是将name
分配给if(!strategy){}
。这对我来说并不直观。如果仅在未定义strategy.name
的情况下运行此代码,如何定义strategy
?就是未定义的对象可以具有已定义的属性吗?还是我看错了?附带说明一下-我一直在网上搜索,试图弄清楚整个javascript中
_
的使用。我知道underscore.js库非常受欢迎,但是该库尚未加载,因此该下划线必须表示其他内容。无论如何,我们会提供任何帮助。谢谢!
最佳答案
为了组织的缘故,让我们正式化评论部分(顺便说一句,为什么现在有这么多人通过评论回答?)
参数重载
这(很不幸)在Javascript中很常见。这是为两个接口提供相同功能的一种方式。我认为,这通常会导致混乱。
但是,在这种情况下,作者希望提供两个签名:Prototype.use(strategy: Object)
和Prototype.use(name: String, strategy: String)
允许呼叫者:Passport.use("name", "strategy");
要么Passport.use({ "name": "name" });
因此,如果第二个参数为falsy(if (!strategy)
),请改用第一个参数(strategy = name;
)。
“”“私人”“”变量
Javascript缺少“私有”变量(闭包除外),因此使用下划线为_property
加上前缀表示外部代码不应访问它,即“自担风险,可能会损坏”。