【问题标题】:Do double-named methods create side-effects?双重命名的方法会产生副作用吗?
【发布时间】:2014-11-02 22:01:38
【问题描述】:

我最近遇到了几个定义对象方法的库,如下所示:

var someObject = {
    myMethod: function myMethod(args){ /* implementation */ }
};

有人可以向我解释一下双重命名的用途吗?我了解function someName(){};var someName = function(){}; 之间的区别,但这种设置对我来说意义不大。

【问题讨论】:

  • 嗯..它是一个对象初始化器(在developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/… 中描述)。
  • 也许我解释的不够清楚:我想知道为什么 myMethod 既是对象定义中的键,又是通过函数定义命名的函数。这有优势吗?
  • 例如,您不必键入 someObject.myMethod 即可在 myMethod 中调用它。
  • 那么在方法自己的闭包中,您可以在递归执行它时将其用作快捷方式吗?对于相当多的冗长来说,这似乎是最小的回报。另外:这个函数名称是如何被带到闭包中的?

标签: javascript methods function-expression


【解决方案1】:

这样做有几个原因。

  • 如果你想从函数内部引用函数本身,最好命名它而不是使用arguments.callee(你甚至不能在严格模式下使用)

  • 如果您 console.log 函数,您会看到方法的名称而不是匿名函数。

  • 使用命名函数更好地记录错误,因为名称将被添加到堆栈跟踪而不是匿名条目。分析(cpu / 内存)也是如此

  • 如果将方法分配给另一个对象,则函数名称保持不变,即使属性名称发生变化。

没有“副作用”,将函数名称视为附加的“私有”变量,并引用只能从函数本身内部访问的函数,方法名称作为“公共”属性名称,您可以更改并用于从外部访问它。

它与函数声明中的名称不同

var someObject = { 
  publicName:function privateName(){
    someObject.publicName(); // is defined
    privateName(); // is defined
  } 
};
function test() {}

test(); // is defined
privateName(); // is undefined
someObject.privateName(); // also undefined
someObject.publicName(); //is defined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2016-06-23
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多