我可以在 JavaScript 窗口全局对象中定义的某个对象中找到 JQuery 函数吗?

     2023-02-22     177

关键词:

【中文标题】我可以在 JavaScript 窗口全局对象中定义的某个对象中找到 JQuery 函数吗?【英文标题】:Can I find a JQuery function inside some object defined into the JavaScript window global object? 【发布时间】:2016-03-22 10:49:10 【问题描述】:

我是 JavaScript 和 JQuery 的新手,我有以下疑问。

我知道如果我打开 FireBug 控制台键入 window 我会看到 global object 的内容在运行到浏览器的 JavaScript 应用程序中是当前浏览器选项卡(窗口)。

好的,所以在这个全局对象中我可以看到所有的全局变量和所有的全局函数(变量和没有在另一个函数中定义的函数)。

所以我有一个链接我的 .js 文件的页面。

这个文件将包含一些像这样的纯 JavaScript 函数:

function myFunction() 
    .................................
    .................................
    .................................

所以我会将 myFunction 函数视为 window 全局对象的一个​​字段,因为该函数是 global(它没有定义在另一个函数中)。这一点我很清楚。

所以,在我的页面内链接的 .js 文件中,我也有这样的内容:

$(document).ready(function() 

    $("#myButton").click(function() 
        ............................................
        ............................................
        DO SOMETHING WHEN THE BUTTON HAVING id="myButton" IS CLICKED
        ............................................
        ............................................
     );
);

所以,这是一个 JQuery 代码,它应该以这种方式工作(如果我做错了断言,请纠正我)。

$JQuery 对象(或者它是什么?)。

在这个 JQuery 对象上,我调用 ready() 函数,该函数是在 DOM 完全呈现时执行其内部回调函数的函数。

所以内部回调函数包含:

$("#myButton").click(function() ...DO SOMETHING...);

选择一个具有 id="myButton" 的按钮并向其添加 click 事件侦听器,该事件侦听器本身定义了在单击按钮时执行的内部回调函数.

是真的吗?

好的...所以我认为所有这些东西都不是直接在全局对象中,因为它不是直接定义到我的 .js 文件中,而是必须在一些专用于 JQuery 的内存空间中。

所以查看 FireBug 控制台内的 window 对象,我发现了两个对象:

$:我认为是 JQuery 对象...所以我认为我以前的自定义 JQuery 函数必须在这里,但我找不到它。

JQuery:这是 window 全局对象内的另一个对象。

所以,我的疑问是:当我在 ready() 函数中声明类似

$("#myButton").click(function() ...DO SOMETHING...);

在哪里可以找到 function() ...DO SOMETHING...window 全局对象中定义的某个对象的定义?我能找到吗?还是我错过了什么?

【问题讨论】:

问题到底是什么?您希望能够检索分配为单击处理程序的函数吗? 我想了解 JQuery 函数在窗口对象结构中的位置,以便深入了解 JQuery 是如何工作的(我需要它来调试其他一些奇怪的情况) 好的-该功能不在窗口的正下方。它是提供给元素本身的点击处理程序的匿名函数。 好的,但是我在哪里可以找到特定选定 div 的点击处理程序? @AndreaNobili - 如果您看到我的回答,有一种方法可以让您看到单击按钮时正在应用的确切功能。尽管其他人在这里指出了什么,但函数是否匿名并不重要,因为 jQuery 存储有关应用的事件侦听器的信息。 【参考方案1】:

jQuery 将其与事件相关的数据存储在应用于每个元素的数据对象events 中。您可以使用$._data() 获取此信息:

$._data($('#myButton')[0], 'events')

$._data(document.getElementById('myButton'), 'events')

要获取您为按钮的点击监听器申请的回调函数,您可以简单地抓取该处理程序。例如:

$("#myButton").click(function ()  console.log('clicked'); );

var eventsInfo = $._data(document.getElementById('myButton'), 'events');

console.log(eventsInfo.click[0].handler);

上面应该打印出“function () console.log('clicked'); ”。

请记住,$._data() 没有可用的公共文档,尽管知道这是一件好事!

以下blog post 在 jQuery v1.8 发布时提到了$._data(),但确实对此发出了警告:

请注意,这不是受支持的公共接口;实际数据结构可能因版本而异。

那是在 2012 年。直到今天,它似乎在最新的 1.x 和 2.x 版本上运行良好,所以我认为这种情况不会很快消失。

【讨论】:

【参考方案2】:

这是一个匿名函数,基本上是一段你不想为其编写命名函数的独特代码。

这是一个一次性用例,或者更确切地说,它用于绑定自定义点击事件,而不会在全局对象中乱扔变量。

匿名函数的作用与您所要求的完全相反,因为您无法在全局对象中找到它(匿名函数)。

.click 是在$.fn 中定义的函数,并且由于$window 对象的一部分,您可以遍历那里找到点击,例如window.$.fn.click 将是$(...).click(func...) 源的路径,但匿名函数是一个被设置然后被遗忘(或多或少)的函数。

毕竟,你没有给它一个名字,所以它没有可以指向的参考。

如果您使用命名函数作为另一个函数的参数,则称为 callback function

匿名函数基本上是一个无名回调函数,回调函数是一个普通函数,可以作为callable传递给其他函数> 参数 - 这个普通函数将在内部使用 .call().apply() 来执行提供的回调,例如,当您绑定 click 时,jQuery 会执行此操作

这里的好处是,事实上,您根本没有遗漏任何东西 - 您问的问题是正确的,因为如果您刚刚开始,但一旦掌握了窍门,这看起来就像魔术一样其中很容易理解和使用(误用所以要小心!)

如果您想知道这种构造是如何工作的,您可以随时构建自己的函数来接受回调/匿名函数,例如

function result_based_on_callback(a, b, fn) 
    fn.call(null, a, b);

上面的函数接受两个参数和一个函数,它会调用函数并提供两个参数给它(nullthis 的上下文,这是一个不同的问题:))

如果我们要使用上述构造进行计算,我们可以这样做:

console.log(result_based_on_callback(1, 2, function(a, b)  return a + b; ));

这将返回3,您也可以使用普通函数执行此操作,否则该函数将接受两个数字并将它们相加 - 它的工作原理相同,只是传入函数 name 而不是身体

像这样:

function do_add(a, b) 
    return a + b;


console.log(result_based_on_callback(1, 2, do_add));

这将完全一样。 我希望这能让你了解它是如何工作的,祝你好运!

【讨论】:

为啥在 JavaScript 中将全局变量添加到窗口对象?

】为啥在JavaScript中将全局变量添加到窗口对象?【英文标题】:WhyareglobalvariablesaddedtoawindowobjectinJavaScript?为什么在JavaScript中将全局变量添加到窗口对象?【发布时间】:2021-08-1823:31:45【问题描述】:为什么在JavaScript中将全局变... 查看详情

javascript中的全局对象,内置对象和预定义对象是啥?

RT1.全局对象是预定义的对象,作为 JavaScript 的全局函数和全局属性的占位符。  通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。  全局对象不是任何对象的属性,所以它没有名称。2.内部对象是编写... 查看详情

全局对象

定义:  全局对象(globalobject)在JavaScript中有着重要的用途,全局对象的属性是全局定义的符号,JavaScript可以直接使用,比如:全局属性undefined,infinity和NaN全局函数isNaN(),parseINt(),eval())构造函数Date(),RegExp()... 查看详情

bom--window对象

1.在浏览器中,window对象即是通过JavaScript访问浏览器窗口的一个接口,又是ECMAscript规定的Global对象,这意味着在网页中的任何一个对象,变量和函数,都是以window作为其global对象。2.定义全局变量和直接在window上定义属性还是有... 查看详情

JavaScript:在 IE 中列出全局变量

】JavaScript:在IE中列出全局变量【英文标题】:JavaScript:ListglobalvariablesinIE【发布时间】:2010-03-1712:37:40【问题描述】:我正在尝试获取我的班级的实例名称。我这样做的方法是遍历所有全局对象并将其与this指针进行比较。它适... 查看详情

我可以在javascript中声明变量的位置

...函数/方法的其他类型的对象中声明变量?我知道可以在Javascript的任何对象中定义属性,但不能在任何地方声明变量。EDIT:我可能没有正确的术语来解释,但是用最简单的词来说,我需要列出可以在JS代码中编写varx=..的位置。请... 查看详情

bom(browserobjectmodel浏览器对象模型)(代码片段)

...浏览器窗口或一个框架。      在客户端JavaScript中,Window对象是全局对象,所有的表达式都在当前的环境中计算。 也就是说,要引用当前窗口根本不需要特殊的语法,可以把那个窗口的属性作为全局变量来... 查看详情

了解 javascript 全局命名空间和闭包

】了解javascript全局命名空间和闭包【英文标题】:understandingthejavascriptglobalnamespaceandclosures【发布时间】:2012-04-0403:53:44【问题描述】:我正在努力提高我对javascript中全局命名空间的理解,我对以下几点感到好奇:是否有一个“... 查看详情

bom之frame框架(代码片段)

...是BOM?BOM就是浏览器对象模型,大家都知道,ECMAScript是JavaScript的核心,但如果要在WEB中使用JavaScript,那么BOM则无疑才是真正的核心,BOM,提供很多对象,用于访问浏览器功能,这些功能与任何页面内容无关,多年来,缺少事实... 查看详情

如何将组件对象放入合成 API 中的全局窗口变量中?

...API)中,我将this放入了一些组件的窗口变量中,因此我可以轻松地测试方法并从开发工具控制台中找出哪些属性值。例如,在我的主页组件中,我只是这样做:mounted 查看详情

如何使用 webpack 访问全局对象(窗口)?

...述】:我正在尝试使用ExternalInterface和webpack将ActionScript与JavaScript交互。ExternalInterface只能激发在全局对象(window)上找到的(call)函数。如何在w 查看详情

ESLint - 未定义“窗口”。如何在 package.json 中允许全局变量

】ESLint-未定义“窗口”。如何在package.json中允许全局变量【英文标题】:ESLint-"window"isnotdefined.Howtoallowglobalvariablesinpackage.json【发布时间】:2015-08-0414:26:55【问题描述】:我正在为全局窗口对象分配一个属性,但是当我运... 查看详情

document对象和window对象

...body>或者<frameset>每次出现时被自动创建,在客户端JavaScript中,Window对象是全局对象,所有的表达式都在当前的环境中计算,要引用当前的窗口不需要特殊的语法,可以把那个窗口属性作为全局变量使用,例如:可以只写do... 查看详情

惊讶于全局变量在 JavaScript 中具有未定义的值

】惊讶于全局变量在JavaScript中具有未定义的值【英文标题】:SurprisedthatglobalvariablehasundefinedvalueinJavaScript【发布时间】:2012-02-2313:03:07【问题描述】:今天,当我看到一个全局变量在某种情况下具有undefined值时,我感到非常惊讶... 查看详情

全局数据/对象的 Javascript 存储/状态

】全局数据/对象的Javascript存储/状态【英文标题】:Javascriptstoring/stateofglobaldata/object【发布时间】:2012-03-2723:12:45【问题描述】:有没有办法将全局数据存储在window对象中,这样数据可以在页面重新加载/刷新后继续存在。所以... 查看详情

javascript基础作用域this原型

作用域(Scope)作用域指变量的作用范围在JS中一共有两种作用域全局作用域和函数作用域(局部)全局作用域直接编写在script标签中的JS代码,都在全局作用域全局作用域在页面打开时创建,在页面关闭时销毁在全局作用域中有... 查看详情

javascript面向对象及相关知识

最近在学习JavaScript面向对象,写下自己的理解及相关资料,以备查阅。一.面向对象中涉及的相关几个概念 1.作用域  所谓作用域,就是说属性和函数的可访问范围。在JavaScript中,作用域分为两种。全局作用域和局部作用域... 查看详情

qt5如何定义一个全局窗口对象呀,就是可以在不同的cpp文件里面调用的

...&globalWidget;需要这个全局对象的,#include"global.h"就可以了追问不用那个extern关键字声明吗这样是调用getGlobalWidget()这个函数吗追答不用extern,因为你调用extern的时候,不能保证这个QWidget已经初始化了。你可以去看看Effective... 查看详情