如何获取JavaScript变量的内存地址?

如何获取JavaScript变量的内存地址?,javascript,spidermonkey,memory-address,Javascript,Spidermonkey,Memory Address,可以找到JavaScript变量的内存地址吗?JavaScript代码是一个正常应用程序的一部分(JavaScript被用作C++前端,不在浏览器上运行)。使用的JavaScript实现是SpiderMonkey。如果可能的话,它将非常依赖于JavaScript引擎。更现代的javascript引擎使用即时编译器编译代码,弄乱它们的内部变量会对性能或稳定性造成不利影响 如果引擎允许,为什么不对一些本机代码进行函数调用接口以交换变量的值呢?这或多或少是不可能的-Javascript的评估策略是始终

可以找到JavaScript变量的内存地址吗?JavaScript代码是一个正常应用程序的一部分(JavaScript被用作C++前端,不在浏览器上运行)。使用的JavaScript实现是SpiderMonkey。

如果可能的话,它将非常依赖于JavaScript引擎。更现代的javascript引擎使用即时编译器编译代码,弄乱它们的内部变量会对性能或稳定性造成不利影响


如果引擎允许,为什么不对一些本机代码进行函数调用接口以交换变量的值呢?

这或多或少是不可能的-Javascript的评估策略是始终使用按值调用,但对于对象(包括数组),传递的值是对对象的引用,而不是复制或克隆。如果在函数中重新指定对象本身,则不会更改原始对象,但如果重新指定对象的某个属性,则会影响原始对象


也就是说,你想完成什么?如果只是在C++和JavaScript之间传递复杂数据,可以使用JSON库进行通信。将JSON对象发送到C++进行处理,并获得JSON对象来替换旧的.j/P> < P>我认为这是可能的,但您必须:

  • 下载node.js源代码
  • 手动添加函数(如返回指针的内存地址等)
  • 编译它并将其用作节点可执行文件
  • 您可以使用侧频道,但除了攻击浏览器安全性之外,您无法使用它做任何有用的事情

    最接近虚拟地址的是ArrayBuffers

    如果在ArrayBuffer中标识了一个虚拟地址, 其余地址也称为两个地址 的内存和数组索引是线性的

    虽然虚拟地址本身并不是物理内存地址,但有一些方法可以将虚拟地址转换为物理内存地址

    浏览器引擎始终分配阵列缓冲页 对齐的。因此,ArrayBuffer的第一个字节位于 新物理页的开头,并且具有最低的有效性 12位设置为“0”

    如果分配了大量内存,浏览器引擎通常 使用mmap分配此内存,该内存已优化为 分配2MB透明大页面(THP)而不是4KB 页数

    当这些物理页面映射到 请求,即,一旦第一次访问页面, 在数组索引上迭代会导致 新页面的开始。解决页面错误的时间是 明显高于正常的内存访问。因此,您可以知道新2MB页面开始的索引。在 在这个数组索引中,底层物理页的 有效位设置为“0”

    这个答案并不是试图提供一个概念的证明,因为我没有时间做这个,但我将来可能会这样做。这个答案试图为提问者指出正确的方向

    来源,


    所谓“嵌入到普通应用程序中”,您的意思是您有一个带有嵌入式Javascript的网页吗?不,它不在浏览器上运行,不涉及任何网页。JavaScript引擎是一个普通的桌面应用程序的一部分。是的,我同意,认为需要在C++中有一些代码可以与JavaScript接口。你能以某种方式改变原始指向的对象吗?你的意思是,在不同的范围内改变对象的引用吗?不。在这种情况下,最好利用JS的封装或面向对象功能,或者将要更改的函数体和引用放在同一范围内,或者将引用和同一对象的函数成员放在同一范围内。这是您的假设吗?