理解晦涩难懂的 JavaScript 代码

2024-02-15

我在以下位置找到了这段代码<head>HTML 页面的部分(这是一位同事制作的,但他不再在这里工作了):

(function(window, PhotoSwipe){ 
    document.addEventListener('DOMContentLoaded', function(){
        var options = {},
            instance = PhotoSwipe.attach( window.document.querySelectorAll('#Gallery a'), options );
    }, false);
}(window, window.Code.PhotoSwipe));

虽然我可以理解中心部分(来自 document.addEventListener),但我无法理解第一行和最后一行。他们在这里做什么?该代码来自名为 PhotoSwipe 的开源图片库。任何指针表示赞赏。

[EDIT]

此代码是否与以下代码相同:

document.addEventListener('DOMContentLoaded', function(){
        var options = {},
            instance = window.Code.PhotoSwipe.attach( window.document.querySelectorAll('#Gallery a'), options );
    }, false);

?


这是一段自动执行的受保护代码。让我们来分解一下:

(function(window, PhotoSwipe){
  ...
}(window, window.Code.PhotoSwipe));

括号使我们的代码自行执行,没有任何其他东西调用它。

这将创建对window and window.Code.PhotoSwipe不能被外部代码篡改。所以在我们的父母中,PhotoSwipe是受保护的别名window.Code.PhotoSwipe. And window,虽然名称没有不同,但也是对外部全局的受保护引用window object.

下一行,addEventListener行,可以重写以将其匿名函数作为命名函数:

function myFunc() {
  var options = {},
      instance = PhotoSwipe.attach( window.document.querySelectorAll('#Gallery a'), options );
}
document.addEventListener('DOMContentLoaded', myFunc, false);

请注意,这在功能上与原始代码中的功能相同,只是我们将该功能从addEventListener打电话并给它起了个名字。

addEventListener附加回调函数来处理某些事件。在本例中,我们正在处理该事件DOMContentLoaded。正在监听此事件document目的。任何时候此活动heard,我们通过调用来响应myFunc.

最后一个参数,false,处理捕获和冒泡。这是事件在 DOM 中传播的两种方法。捕获时,事件从 DOM 顶部向内移动。当冒泡时,它们从 DOM 内部向外移动。使用false说明你想在其处理这个bubbling phrase.

Within myFunct,任何时候都会调用DOMContentLoaded事件发生在document,我们有一行代码,它首先声明一个名为options。该对象是空的,没有成员。

其次,您将两个参数传递给attach的方法PhotoSwipe目的。第一个方法是选择器。它在 DOM 中搜索匹配的元素是什么?#Gallery a,表示 ID 为“Gallery”的元素内的任何锚元素。这意味着以下所有内容:

<div id="Gallery"><a href="#">Foo</a></div>

Or

<div id="Gallery">
  <div class="picture">
    <a href="#">Open</a>
  </div>
  <div class="picture">
    <a href="#">Open</a>
  </div>
</div>

这与我们创建的空对象相关联。什么PhotoSwipe目前内部情况尚不清楚,因为此处未提供该代码。

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

理解晦涩难懂的 JavaScript 代码 的相关文章

随机推荐

  • Git 挂钩脚本可以与存储库一起管理吗?

    我们想要制作一些我们都可以共享的基本钩子脚本 用于预格式化提交消息之类的事情 Git 有钩子脚本 通常存储在
  • Xcode 6 链接器错误 - 架构 armv7 的未定义符号

    升级到 Xcode 6 beta 7 现在仍然使用 Xcode 6 GM 后 我无法链接我的 Swift 应用程序 我收到如下错误 架构armv7的未定义符号 swift stdlib compareNSStringDeterministi
  • 回收位图

    我正在从事涉及位图操作的项目 因为我不想出现 OutofMemoryError 所以我尝试回收每个未使用的位图 不幸的是 我回收了太多并且出现了 尝试使用回收的位图 错误 我在用 Bitmap createBitmap bmp x y w
  • 如何检查设备是否已加入 AD 或 Azure AD 加入/注册?

    我需要检查我的设备是否已加入本地域或 Azure AD 加入 注册 如何检查这个 我试过NetGetJoin信息 https learn microsoft com en us windows desktop api lmjoin nf l
  • 如何跨面或网格绘制 geom_line [重复]

    这个问题在这里已经有答案了 我的数据 Plate Month Day Concentration A April 1 17 1094 B April 2 16 001 C April 3 17 9501 D April 4 18 3686
  • 当 NSPasteboard 添加内容时收到通知

    在我的应用程序中 如果 NSPasteboard 中添加了某些内容 我希望收到通知 如果我从任何其他程序复制文本 我希望我的应用程序知道它 我在某处读到 不能那样做 我应该创建一个计时器并自己检查 NSPasteboard 的内容 这是要做
  • 检查Python脚本中的程序是否存在[重复]

    这个问题在这里已经有答案了 如何从 python 脚本检查程序是否存在 假设您想检查是否wget or curl可用 我们假设它们应该在路径中 最好能看到多平台解决方案 但目前 Linux 就足够了 Hints 运行命令并检查返回代码并不总
  • client.user.setActivity 发现为 null? (节点.js)

    我正在尝试将我的 Discord 机器人的活动设置为 游戏 但是我在网上找到的示例根本没有帮助 client user setActivity what the bot is playing 根本不起作用 它给了我这个错误 说明我正在尝试找
  • 挂起互操作 COM 对象的问题

    我有一个应用程序 它使用 COM 互操作来创建一个电子表格 该电子表格在客户端计算机上的 Excel 中打开 但是 如果我查看任务管理器 当用户关闭 Excel 时 EXCEL exe 进程并不总是结束 如果我保存工作簿并以编程方式关闭 E
  • 使用 Netty 的异步 HTTP 客户端

    我是 Netty 新手 仍在努力寻找自己的方法 我正在寻找创建一个异步工作的 http 客户端 http的netty例子只展示了如何等待IO操作 并没有展示如何使用添加监听器 所以最近几天我一直在努力解决这个问题 我正在尝试创建一个请求类
  • jQgrid 工具栏搜索 - 从任何列动态删除搜索框

    我正在使用 jqgrid 版本 4 4 4 现在我面临一个与工具栏搜索相关的问题 正如我在标题中提到的 我想从任何列中删除工具栏搜索的搜索框 动态地 在渲染网格期间或之后 我用谷歌搜索 但没有找到关于我的这个问题的任何相关解决方案 我用了s
  • 列表中 dict 对象的元素顺序

    我从 HOSTS 获得以下列表 HOSTNAME H1 H2 H3 SW VERSION 7 2 2 5 2 2 6 2 2 OSPF NEIGHBOR 10 1 1 1 10 1 1 2 10 1 1 3 我将它们转换为字典对象列表 如下
  • PayPal REST 订阅 API 未在订单摘要中显示价格

    我正在沙箱环境中测试用于订阅的 PayPal REST API 并注意到 当转到创建协议后返回的批准 URL 时 页面左侧的订单摘要窗格下没有显示价格 显示描述 但没有价格 税等 计划 ID 将传递给创建协议的调用 其中包含我希望作为用户在
  • 是否有 FAT FS 驱动程序希望引导扇区的字节 508 和 509 为零?

    在实施的同时我自己的引导扇区加载程序从 2012 年开始 https hg ulukai org ecm ldosboot rev 17884e6352e6 l1 255我确保将偏移量 508 和 509 处的字节清零 这些是标准 512
  • android 中是否有与 iphone 中相同的默认谷歌地图标记?

    我在我的 android 应用程序中使用谷歌地图 我想表示用户的当前位置默认谷歌地图标记类似于 iphone 中的地图标记 目前我使用 png 图像来表示当前位置 但需要将其替换为默认地图标记 如果 Android 中存在 如果有人知道 请
  • 如何在 Groovy 中检查该对象是列表、集合还是数组?

    问题就像标题一样简单 如何在 Groovy 中检查该对象是列表 集合还是数组 但找不到简单的方法来检查它 有任何想法吗 A List is a Collection 因此检查并不相互排斥 def foo boolean isCollecti
  • 在 silverlight 中使用自动完成框?

    我当前正在 Telerik 的 radgrid 控件中显示数据 我想在名为 Name 的列上添加一个自动文本框 我怎样才能做到这一点 我的 radgrid 仅显示数据 我希望每当用户输入文本框时都会弹出一个名称列表 就像在 stackove
  • 如何在WPF中制作反射效果? (来自代码)

    我需要在 WPF 中有一些镜像对象 我有一个包含一些内容的画布 我需要 50 个视觉克隆 如果我修改源上的某些内容 则应该在这些克隆中更新它 我知道通过将 VisualBrush 的 Visual 绑定到元素在 XAML 中很容易做到 但似
  • 如何在 Spock 集成测试中启动 Spring Boot 应用

    运行集成测试的最佳方法是什么 例如 IntegrationTest http docs spring io spring boot docs 1 1 0 BUILD SNAPSHOT api org springframework boot
  • 理解晦涩难懂的 JavaScript 代码

    我在以下位置找到了这段代码HTML 页面的部分 这是一位同事制作的 但他不再在这里工作了 function window PhotoSwipe document addEventListener DOMContentLoaded funct