为什么我会分配一个函数声明命名变量?(Why would I assign a function d

2019-09-19 03:43发布

编辑: 这不是一个函数声明为命名变量的赋值 -检查接受的答案。 留下标题,因为它是因为其他人可能会做出同样的错误我。


在阅读保罗爱尔兰的infinitescroll jQuery插件代码,我一次又一次地绊倒在以下模式:

...
_create : function infscr_create (options, callback) { /* ... */ },
...

什么是做,而不是这个的好处:

...
_create : function (options, callback) { /* ... */ },
...

Answer 1:

那好处(这被称为“命名的函数表达式”)是函数具有实际名称。 在你的第二个版本, 属性有一个名称,但功能却没有。 让功能实际名称可以帮助你的工具可以帮助你(调用堆栈列表,断点列表等)更多: Anonymouses匿名

它的缺点是,它有一些破碎的JavaScript引擎意想不到的结果,像在IE8和更早版本。 在IE8和更早的版本,保罗爱尔兰的形式创建在两个完全不同的时间两个单独的函数 。 但是,除非你继续和使用引用他们两人,并期望他们是相同的功能(例如,钩住何时脱钩事件处理程序),它不是一个真正的问题。 鉴于这是保罗,我猜他肯定是没有做到这一点。


回复您的问题标题:请注意,这不是一个函数声明 ,但你可以原谅的思想是,因为它看起来几乎完全一样的。 :-)这是一个函数表达式 。 函数声明与函数表达式发生在完全不同的时间,并且对其中产生它们的范围不同的影响。

只是为了完整性:

// This is a function declaration -- note that it's not a "right-hand
// value", e.g., we're not using the result of it immediately (via an
// assignment, a property initializer, calling it, or passing it into
// a function as an argument -- none of those).
//
// Declarations happen upon entry to the scope (not as part of step-by-
// step code). The function's name is added to the scope in which it's
// declared. Declarations are illegal inside branches (`if`, `try/catch`,
// `for`, etc.), but some engines will rewrite them as expressions for
// you if you do that. Others will not, they'll just always declare the
// function regardless of whether the code was reached. So don't do that.
function foo() {
}

// These are all anonymous function expressions. The function in the
// expression has no name, although some debuggers are pretty smart
// about looking at the expression and (where they can) listing a
// kind of pseudo-name for the function. Others are not that smart,
// which is why I avoid anonymous functions.
//
// Expressions happen when they're reached in step-by-step code.
var f = function() { };
var obj = {
    prop: function() { }
};
doSomethingCoolWithAFunction(function() { });
(function() { })(); // Call it immediately
!function() { }();  // Call it immediately
~function() { }();  // Call it immediately, there are a few variants

// These are all *named* function expressions.
//
// Since they're expressions, they happen when they're reached in the
// step-by-step code. The function's name is NOT added to the containing
// scope (except by engines with bugs).
//
// These are the same examples as above, but with a name. No other changes.
var f = function foo() { };
var obj = {
    prop: function foo() { }
};
doSomethingCoolWithAFunction(function foo() { });
(function foo() { })(); // Call it immediately
!function foo() { }();  // Call it immediately
~function foo() { }();  // Call it immediately, there are a few variants


Answer 2:

  1. 该函数的名称,而不是一个匿名函数; 这显示了在调试跟踪,使调试更加方便。
  2. 该功能可以使用通过调用调用本身infscr_create()


文章来源: Why would I assign a function declaration to a named variable?