2

我想知道这之间有什么区别:

var o = {
    name: 'John',
    getName: function getName() {
       console.log(arguments.callee.name + ' was called');
    }
}

o.getName();

对于“常规”匿名方法:

var o = {
    name: 'John',
    getName: function () {
       console.log('getName was called');
    }
}

o.getName();

因为显然第一个似乎有一些好处......有什么缺点吗?

4

2 回答 2

2

有什么败笔吗?

是的。

  • arguments.callee已弃用。您应该只参考getName获取函数对象。
  • .name是一个非标准属性,不要期望它在每个浏览器中都能工作。
  • 命名函数表达式在古怪的引擎中引起一些问题

我会去

var o = {
    name: 'John',
    getName: function getName() {
       console.log('getName was called');
    }
};

你有一个命名函数(这有利于调试调用堆栈),log()但仍然有效。

于 2013-10-09T11:47:33.457 回答
1

唯一的区别是您的第一个示例生成了一个命名函数,而您的第二个示例没有。命名函数在编写错误处理程序时很有用,因为您可以在上下文中获取函数的名称。我确信它们还有其他用途,但我知道检索名称不一定是跨浏览器友好的,所以不要指望它在每个浏览器中都能正常工作。

Live Demo

var myFunctionVar = function test(){
    alert(arguments.callee.name);
};

var myFunctionVar2 = function (){
    alert(arguments.callee.name);
};

myFunctionVar();

myFunctionVar2();

正如 RobG 和 Bergi 所指出的,使用上述代码存在问题,因此请在使用前多做一些研究。

于 2013-10-09T11:47:46.410 回答