javascript中两个模块声明有什么区别?

2023-11-27

JavaScript 中模块的两次声明有什么不同? 一个函数周围有括号,而另一个则没有?

一篇文章说

注意匿名函数周围的 ()。这是由 语言,因为以标记函数开头的语句是 始终被视为函数声明。包括 () 创建一个 函数表达式代替。

检查时两者似乎都做了同样的事情。

var person = (function () {
    // Private
    var name = "Robert";
    return {
        getName: function() {
            return name;
        },
        setName: function(newName) {
            name = newName;
        }
    };
}());

var person = function () {
    // Private
    var name = "Robert";
    return {
        getName: function() {
            return name;
        },
        setName: function(newName) {
            name = newName;
        }
    };
}();

JavaScript 中的函数有两种类型:声明和表达式。

这是两者的区别:

  1. 函数声明被提升。这意味着您可以在函数出现在程序中之前调用该函数,就像 JavaScript 中的声明一样hoisted.
  2. 可以立即调用函数表达式。函数声明不能​​。这是因为表达式express(或返回一个值)。函数表达式表达一个函数。

函数声明的示例:

foo("bar");

function foo(bar) {
    alert("foo" + bar);
}

上面的程序会起作用,因为foo是一个函数声明。

foo("bar"); // throws an error, foo is undefined - not a function

var foo = function (bar) {
    alert("foo" + bar);
};

上面的程序将不会像foo被声明为undefined,提升,然后分配函数表达式的值。因此它是undefined当它被调用时。

函数表达式的示例:

(function (bar) {
    alert("foo" + bar);
}("bar"));

上面的函数将被立即调用,因为它是一个函数表达式。

function (bar) {
    alert("foo" + bar);
}("bar"); // throws an error, can't call undefined

上面的函数不会立即被调用,因为它是一个函数声明。请记住,声明并不表达(或返回值)。所以这就像试图调用undefined作为一个函数。

函数如何变成表达式?

如果在需要表达式的上下文中使用函数,则将其视为表达式。否则,它将被视为声明。

在以下情况下需要表达式:

  1. 您正在为变量分配一个值(即identifier = expression).
  2. 括号内(即( expression )).
  3. 作为运算符的操作数(即operator expression).

因此以下都是函数表达式:

var foo = function () {};
(function () {});
~function () {};

其他一切都是函数声明。简而言之,如果您的函数前面没有任何内容,那么它就是一个声明。

看这段代码:https://github.com/aaditmshah/codemirror-repl/blob/master/scripts/index.js#L94

以下功能isExpression用于测试任意 JavaScript 代码是否是表达式:

function isExpression(code) {
    if (/^\s*function\s/.test(code)) return false;

    try {
        Function("return " + code);
        return true;
    } catch (error) {
        return false;
    }
}

希望这能消除您心中的任何疑问。

简而言之:

  1. 函数表达式表达或返回一个值(在本例中是一个函数)。因此它可以立即被调用,但在它出现在程序中之前不能被调用。
  2. 函数声明是hoisted。因此可以在它出现在程序中之前调用它。然而,由于它不表达任何值,因此无法立即调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript中两个模块声明有什么区别? 的相关文章

  • 如何在 Firefox 控制台中访问附加内容脚本?

    我为 Firefox 和 Chrome 开发了一个插件 它有内容脚本 我想在浏览器选项卡的控制台中访问它们 在 Firefox 上网页控制台 https developer mozilla org en US docs Tools Web
  • 无法在 JavaScript for 循环中读取 null 的属性“长度”

    我正在尝试制作一个像 Stack Overflow 那样的 Markdown 编辑器 如果我实际上没有在文本区域中键入星号和包含短语的 http 我会收到标题中列出的此错误 如果我只输入包含星号的短语 则错误指的是这一行 if linkif
  • Javascript DOM setAttribute 在函数调用中不起作用

    我有一个带有输入元素的 HTML 文件 我希望向其中添加一个名为 valid fieldset011 的新属性 该属性用作 AngularJS 验证器的链接 输入元素具有属性 id fieldset011 如果我使用以下脚本 包含在脚本标签
  • 仅单击 div 内部

    我正在为一个小网站制作教程 我只想让教程气泡可点击 因此 当我们尝试单击气泡之外的某些内容时 什么也不会发生 换句话说 我希望我的 html 不可点击 而 tutorial bubble 可点击 尝试这个 jQuery function h
  • window.onbeforeunload 在 Android Chrome 上不会触发 [alt.解决方案?]

    我开发了一个简单的聊天应用程序 我正在使用 window onbeforeunload当有人关闭选项卡 浏览器时 基本上是当用户离开房间时 通知其他用户 这是我的代码 scope onExit function scope chatstat
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

    所以我在 V8 控制台上玩了很多 我做到了 Object getOwnPropertyNames 我期望得到 结果 然而 length 所以这意味着不是成为原型链的一部分 length是所有人的成员财产Array对象 这是一个错误 还是有任
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • 循环遍历元素并逐步为每个元素应用 CSS 规则

    我有一个网格布局 每个网格布局中都有不同数量的元素 我想动态添加内联grid column通过循环遍历 div 中存在的每个元素的 CSS 规则 ul 与一类 list 所以 HTML 代码的输出需要是 ul class list ul u
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 如何检测元素内容何时发生变化

    我正在寻找一种方法来监视元素内动态填充 无页面重新加载 内容 以便我可以将类添加到另一个元素 到目前为止我有这个 HTML div class message container div class messages error span
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • 尝试在 React 应用程序中连接到 MySQL 数据库时,无法读取未定义的属性(读取“查询”)错误

    我正在尝试连接到 MySQL 数据库并在单击按钮后在 React 应用程序中运行查询 一些它如何给出错误 我当前的代码如下所示 import mysql from mysql function App async function sync
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • 使用 JQuery 根据下拉列表选择的值显示/隐藏控件

    我正在尝试使用 JQuery 根据下拉菜单的选定索引显示 隐藏 div 标签 但它不起作用 任何帮助将不胜感激 Thanks

随机推荐

  • IdentityServer4 Net Core 2不调用自定义iProfileService

    我已将 Identity Server 项目升级到 Net Core 2 现在我无法调用 iProfileService 对象来添加自定义用户声明 它在 Net Core 1 中确实有效 Startup cs的ConfigureServic
  • 如何让 C 程序等待(在 Linux 上)?

    如何让 C 程序等待 在 Linux 上 我需要使用等待与 MPI 我需要 C 代码 如果要等待 MPI 请求 请使用 MPI Wait http www manpagez com man 3 MPI Wait 如果您想等待一定时间 请使用
  • gitk:奇怪的历史树

    我正在将 svn 存储库移植到 git 使用 svn2githttps www negativetwenty net redmine projects show svn2git 并且由于 svn 不跟踪合并 我需要手动编辑 git info
  • 为什么 .html() 不能与使用 jquery 的 SVG 选择器一起使用?

    Question有人可以告诉我如何将 SVG 元素转换为字符串吗 我在用着canvg将我的 SVG 转换为图像 它必须首先在画布中渲染 canvg 方法期待一个SVG STRING code function updateChartImag
  • 使用 Url 视图帮助链接时从 URL 中删除参数

    使用 Url view helper 构建链接时 如果当前页面的 url 中有参数 则 Url view helper 生成的 url 也会包含参数 例如在页面中 控制器 操作 参数 值 下面的代码 a href Dashboard a 将
  • 如何从WKInterfaceButton获取标题

    要获得标题 有函数 setTitle 但是如何将 WKInterfaceButton 的标题作为字符串获取 我没有找到任何东西https developer apple com library prerelease ios document
  • Python 2 中的类型提示

    In PEP 484 类型提示被添加到 Python 3 中 其中包括typing模块 在Python 2中有什么办法可以做到这一点吗 我能想到的就是有一个装饰器添加到方法中来检查类型 但这会在运行时失败 并且不会像提示所允许的那样更早被捕
  • AWS S3 中的“KeyError: 'Records'” - Lambda 触发器

    我有以下 lambda 函数代码 用于简单地打印 S3 存储桶的上传事件的作者和元数据 from future import print function import json import urllib import boto3 pri
  • 解析Robot Framework的输出xml

    机器人框架吐出一个输出 XML 然后用于构建 HTML 报告 带有rebot 重新运行失败等 我需要解析此文件以生成其他报告 特别是 我需要解析正则表达式的测试用例文档 获取测试用例结果 然后构建报告 这是为了与遗留系统集成 Robot F
  • 如何用新的 viewController 替换当前的 viewController

    我正在尝试用新的视图控制器替换当前的视图控制器 我之前已经能够做到这一点 但我遇到了一些 BAD ACCESS 问题 这是当我想用新视图替换当前视图时将运行的代码 该函数将使用本地属性 self some data 非原子 保留 调用 vo
  • 从 PySpark DataFrame 中的 Python 列表列表中删除元素

    我正在尝试从 Python 列表中删除一个元素 sources 62 7 32 62 18 36 62 7 31 36 62 7 32 62 我希望能够删除一个元素 rm 来自上面列表中的每个列表 我编写了一个可以对列表列表执行此操作的函数
  • MFC中多行cstatic文本垂直居中

    怎样才能制作一个CStatic文本自动换行 多行 将结果垂直居中在控件的矩形中 我试图解决的问题是 我有一个CStatic控制旁边的CComboBox根据选择更新信息文本 该文本可以短也可以长 需要CStatic有时使用多线 有时不使用 我
  • 如何将 mime 类型添加到 htaccess 文件?

    我在向服务器添加 mime 类型时遇到问题 这是我当前的 htaccess AuthUserFile usr local www pass htpasswd AuthType Basic AuthName Mockups
  • elasticsearch 映射 tokenizer 关键字以避免分割标记并启用通配符

    例如 我尝试在给定字段上使用 angularjs 和 elasticsearch 创建自动完成功能countryname 它可以包含简单的名称 如 法国 西班牙 或 组合名称 如 塞拉利昂 在映射中该字段是not analyzed防止弹性标
  • 求包围一组点的边界多边形的面积

    我在天空图上有一系列点 我想找到这些点占据的面积 为此 我需要找到包含这些点的多边形的顶点 将这些点转换为等积投影 然后计算出面积 除了如何计算包围图形上的点的多边形的顶点之外 我还编写了所有代码 做这个的最好方式是什么 您选择的多边形不是
  • 在换行符处拆分单个单元格

    我有一个电子表格 其中的数据位于用换行符分隔的单个单元格中 我需要将单元格分成单独的行 以便我可以删除一些数据并重新组合 像这样 Item Status 285T1150 3 285T0680 1 1 Complete 285T1145 7
  • 如何在 Django 中测试 celery period_task?

    我有一个简单的周期性任务 from celery decorators import periodic task from celery task schedules import crontab from models import Su
  • 如何保存包含指针的ctypes对象

    我使用第 3 方库 它在大量计算后返回包含指针的 ctypes 对象 如何保存 ctypes 对象以及指针指向的内容以供以后使用 我试过 scipy io savemat gt 类型错误 无法将对象转换为数组 cPickle gt 包含指针
  • 使用 php 将事件添加到谷歌日历

    我正在开发一个客户端网络应用程序 用户可以在其中预订带有日期 时间 位置等的驱动器 客户要求将每次预订都添加为他的 Google 日历上的活动 我创建了一个 API 密钥并下载了 PHP API 客户端 https github com g
  • javascript中两个模块声明有什么区别?

    JavaScript 中模块的两次声明有什么不同 一个函数周围有括号 而另一个则没有 一篇文章说 注意匿名函数周围的 这是由 语言 因为以标记函数开头的语句是 始终被视为函数声明 包括 创建一个 函数表达式代替 检查时两者似乎都做了同样的事