我遇到一个与我遇到的简单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加上前缀表示外部代码不应访问它,即“自担风险,可能会损坏”。

10-06 08:27