为什么要将函数声明分配给命名变量?

2024-03-29

Edit: 它不是将函数声明分配给命名变量- 检查已接受的答案。保留标题,因为其他人可能会犯和我一样的错误。


在阅读保罗·爱尔兰的著作时无限滚动 https://github.com/paulirish/infinite-scrolljquery 插件代码,我一次又一次地偶然发现以下模式:

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

这样做有什么好处而不是:

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

这样做的好处(称为“命名函数表达式”)是函数有一个实际的名称。在你的第二个版本中,property有名称,但函数没有。为函数提供实际名称可以帮助您的工具为您提供帮助(调用堆栈列表、断点列表等)更多:匿名者匿名者 http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html

The 坏处其原因是,它在一些损坏的 JavaScript 引擎中会产生意想不到的结果,例如 IE8 及更早版本中的引擎。在 IE8 及更早版本中,Paul Irish 的版本创建两个完全不同时间的两个独立功能 http://blog.niftysnippets.org/2010/09/double-take.html。但这并不是真正的问题,除非您保留并使用对它们的引用,并期望它们是相同的函数(例如,在挂接和取消挂接事件处理程序时)。鉴于是保罗,我猜他肯定不会这样做。


回复你的问题标题:请注意,它是not一个函数宣言,但你这样认为是可以原谅的,因为它看起来几乎一模一样。 :-) 这是一个函数表达。函数声明和函数表达式发生在完全不同的时间,并且对它们创建的范围有不同的影响。

只是为了完整性:

// 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要将函数声明分配给命名变量? 的相关文章

  • 在 getElementsByClassName 的数组上使用 forEach 会导致“TypeError: undefined is not a function”

    In 我的 JSFiddle http jsfiddle net jer2 zcrh9 3 我只是想迭代一个元素数组 正如日志语句所证明的那样 该数组非空 然而 呼叫forEach给了我 不太有帮助 未捕获TypeError undefin
  • 预渲染 vue.js 2.0 组件(类似于 vue 1 中的 this.$compile)

    我正在努力使可重复使用的组件网格堆栈 https github com troolee gridstack js 我找不到一种简单的方法来做类似的事情this compile方法来自vue 1 我见过这个example http codep
  • 在文件之间共享变量(没有全局变量)

    据我了解 使用创建的变量let在 Javascript 中不能是全局的 我thought这意味着该变量仅存在于该特定文件中 然而 当我做一个简单 人为的例子时 A js let a 5 B js console log a 索引 html
  • 支持 Javascript 链式关系运算符吗?

    我只是尝试了一些 JS 核心原则 发现引擎评估链式关系运算符时不会抛出错误 相反 他们以一种我自己无法理解的方式进行评估 console log 1 lt 2 lt 3 lt 4 lt 5 true expected console log
  • Mongoose VersionError:保存文档时找不到 id 的匹配文档

    通过 sync API 请求同步用户购物车时 我反复看到以下错误 每当用户更改购物车的内容时就会调用此函数 VersionError 找不到 id 的匹配文档 2y4b1hq601cd013e0af25e32 版本4修改路径 购物车 car
  • 直接加载页面到锚标记

    当我加载 URL 中带有哈希标记的页面时 页面会加载 然后跳转到锚标记 有没有什么方法可以防止这种 跳转 要么直接将页面加载到锚标记 要么至少使滚动平滑 我在 Chrome 和 Firefox 中看到这个问题 但在 IE 中没有 如果你仍然
  • Ace编辑器使用javascript触发事件

    有没有类似的东西 editor getSession trigger change 我想要这个的原因是因为编辑器进出新的 所以当它返回视图时我需要它做正常的 更改 事情 但我不想等待用户输入 目前我有 editor getSession o
  • JavaScript 中使用 eval() 执行用户输入的安全风险

    我计划为我的学生制作一个快速网页来教他们 JavaScript 编程 在此页面上 我想为他们提供一个文本框并允许他们运行 JavaScript 以便他们可以看到该语言在工作中的动态特性 然而 我很清楚 对用户输入使用 eval 通常是一个非
  • 使用 CORS 进行 React 中的 Fetch 时出现问题

    我对 CORS 完全陌生 并且遇到以下问题 我正在使用 create react app 端口 3000 调用 spring boot 端口 8080 中创建的一些 REST 服务 我将 JWT 身份验证添加到我的 REST API 中 因
  • Angular:将数据从工厂 ajax 调用传递回我的控制器

    我一直在使用 Angular 并且已经从使用本地数据 似乎工作正常 转向尝试通过工厂中的 ajax 调用来填充我的视图 这是代码 div h2 Get data using a Factory h2 div div div
  • Javascript 子字符串方法帮助

    长话短说 我正在开发一个 Web 应用程序并在其中使用 AJAX 我试图禁用点击时链接的默认操作 将哈希值附加到链接 然后从网址中删除 我遇到的问题是 虽然哈希值被相应地附加 但子字符串方法并没有提取 而是提取了它后面的字母 这是我的代码
  • 如何在android中使用webview明智地显示Html内容页面?

    您好 我创建了一个简单的应用程序来在 webview 中显示 html 页面 我使用 webview 并显示页面加载时间 如下所示 此后禁用滚动并使用下一个和上一个按钮来后退和前进包含 所以我的代码如下 首先onCreate显示添加webv
  • 使用 arrayRemove() 从 firestore 9 数组中删除对象?

    我正在尝试从 firestore 中的数组中删除一个对象 但遇到了障碍 执行删除的要求或参考是什么 对象中的一个键值是否足以执行删除操作 或者该对象是否应该与要删除的对象相同 const deleteWeek async gt const
  • facebook graph api 确定用户是否喜欢 url

    如果用户当前登录 Facebook 并喜欢当前页面 我想显示不同的消息 我明白 FB Event subscribe edge create function response you like this 当用户喜欢该页面时 它将触发 但是
  • 在 JS 中的浏览器中输入 url 时,偏移哈希标签链接以调整固定标头

    我希望创建一个页面 允许哈希标签跳转到页面的某些内容 e g http example com page1 http example com page1是一个普通页面 http example com page1 info http exa
  • 我想从 Cakefile 运行 d3

    我想从命令行执行一些 d3 代码 最初我只是尝试了类似的方法 task data Build some data with d3 gt d3 require lib d3 v2 console log d3 version d3 versi
  • 在 AngularJS 中使用 iFrame

    Using Angular 1 2 我正在尝试找出一种 有角度 的方式来加载 iFrame 但我在任何地方都找不到任何教程 任何真正的讨论 基本上 我有一个显示链接列表的搜索页面 单击链接应调用控制器中的一个函数 该函数将数据 可能通过 h
  • 如何使用 Chart.js 在堆积条形图中显示内联值?

    我正在使用 Chart js 库在堆叠条形图中显示一些值 但我正在努力找出如何显示条形图中的值 即 现在 我有以下代码 可以在条形顶部显示数字 但我想知道如何在条形内部显示它们 var numberWithCommas function x
  • 使用 v-bind Vue.js 的多个变量

    我试图在以下代码中传递多个变量 div div 但我收到以下错误 Vue warn 无法生成渲染函数 SyntaxError 意外的标记 在 我尝试更换 with a 但我得到 Vue warn 无法生成渲染函数 SyntaxError I
  • 在 Firefox 中单击桌面通知时如何将焦点移至选项卡?

    我正在一个网站中实现桌面通知 该网站会在新消息到达时显示通知 我希望当用户单击通知时 打开网站的浏览器选项卡能够获得焦点 我可以使用以下代码在 Chrome 中实现此功能 var n new Notification Title body

随机推荐