我遇到一个与我遇到的简单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
? IE浏览器。一个未定义的对象可以有一个已定义的属性 - 或者我不正确地看这个?
作为旁注 - 我一直在网上搜索试图找出整个javascript中_
的用法。我知道underscore.js库非常受欢迎,但该库尚未加载,因此这个下划线必须表示其他内容。
无论如何,任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
为了组织起见,让我们将评论部分正式化(顺便说一下,为什么现在有很多人通过评论回答?)
这是(不幸的是)在Javascript中很常见。它是一种为两个接口提供相同功能的方法。在我看来,这通常会导致混乱。
尽管如此,在这种情况下,作者想要提供两个签名:
Prototype.use(strategy: Object)
和
Prototype.use(name: String, strategy: String)
允许来电者:
Passport.use("name", "strategy");
或
Passport.use({ "name": "name" });
因此,如果第二个参数是假的(if (!strategy)
),那么请改用第一个参数(strategy = name;
)。
Javascript缺乏"私有"变量(闭包除外)所以使用下划线为_property
添加前缀表示它不应被外部代码访问,即"使用你自己的危险,可能会破坏"。