将JavaScript引擎嵌入到.NET中
只是想知道是否有人尝试过嵌入并实际将任何JS引擎集成到.NET环境中.我可以找到并实际使用(在 lot 之后,由于它已经过时了,而且还没有完成)蜘蛛侠 - 点网项目.有人在这个领域经验吗?像松鼠这样的引擎,V8 .. 并不是说我对Mozilla的SpidermonKey不满意(将其用于核心ASP.NET应用程序中的自定义组件的类似Rails的Miniframework),但我仍然很想进一步探索这些选项.命令行的解决方案不是我需要的,我不能依靠CLR以外的任何东西,我需要调用/到JavaScript/C#对象. // c# class public class A { public string Hello(string msg) { return msg + " whatewer"; } } // js snippet var a = new A(); console.log(a.Hello('Call me')); // i hav
0 2024-04-10
编程技术问答社区
如何在Windows下构建SpiderMonkey?
我尝试在窗户下构建蜘蛛侠. I follow the documentation under https://wiki.mozilla.org/JavaScript:New_to_SpiderMonkey 我已经从不同的是,我使用当前vs 15.9.11代替旧的15.8. 如果我尝试在Mozilla构建外壳内拨打configure,则找不到C编译器: Winuser@Winuser /c/workspace-cpp/spidermonkey/js/src/build_DBG.OBJ $ ../configure --enable-debug --disable-optimize Reexecuting in the virtualenv checking for vcs source checkout... hg checking for a shell... C:/mozilla-build/msys/bin/sh.exe checking for host syst
0 2024-04-04
编程技术问答社区
在两个第三方库中为uint32重新定义类型(C2371)。
在我的应用程序中,我正在使用 box2d 和 spidermonkey .两个库都定义了UINT32类型,在同一编译单元中使用两者时,显然会给我一个编译器. b2settings.h(box2d):typedef unsigned int uint32; jSotypes.h(spidermonkey):typedef unsigned long uint32; 有什么方法可以解决此碰撞而无需更改第三方库的标题? 我感谢每个提示! 解决方案 您可以执行此技巧: #define uint32 Box2D_uint32 #include "Box2D.h" #undef uint32 #define uint32 Spider_uint32 #include "Spidermonkey.h" #undef uint32 由于typedef仅仅是一个别名,因此只要这些标头仅包含声明,就不会引起违反ODR违规行为.如果有使用UINT32的(结构或内联函数
2 2024-04-03
编程技术问答社区
JavaScript数组实际上是作为数组实现的吗?
JavaScript Array和Object之间的区别不是很大.实际上,似乎Array主要添加了length字段,因此您可以将Array s和Object s用作数字数组: var ar = new Array(); ar[0] = "foo"; ar["bar"] = "foo"; var ob = new Object(); ob[0] = "foo"; ob["bar"] = "foo"; assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true. 所以我的问题是,在流行的JavaScript引擎中(,javascriptcore, spidermonkey 等),这是如何处理的?显然,我们不希望我们的数组实际上被存储为具有关键值的哈希地图!我们如何合理地确定我们的数据被存储为实际数组? 据我所知,发动机可以采用一些方法: Array的实现方式与
2 2024-03-04
编程技术问答社区
在JavaScript中应用函数
我正在学习javaScript,目前我正在尝试弄清为什么(在 spidermonkey ) [].concat.apply([1], [[2]]) 返回预期[1, 2],但是 Array.concat.apply([1], [[2]]) 返回[2]而不是[1, 2]. 有人可以提供一个很好的解释吗? 解决方案 [].concat是Array.prototype.concat. Array.concat是一种仅Firefox的静态方法,可以连接一个或多个数组并忽略其this参数.
0 2024-03-02
编程技术问答社区
在python中模拟单击javascript链接
我正在尝试整理餐馆的评论. Urllib2在评论的初始页面上正常工作,但是然后有一个链接来加载下一个注释的增量,即JavaScript链接.一个示例页面是NEXT 25>> 我已经查看了所有以前的答案( e.g. ),我不得不说我并不明智.查看Firebug中的控制台并不提供方便的链接.您能建议实现这一目标的最好的(最简单)的方法吗? 编辑: 感谢SeleniumNewbie此代码将打印出评论中的所有评论.: from selenium import webdriver from BeautifulSoup import BeautifulSoup import re
32 2023-12-01
编程技术问答社区
带块的常量声明
最近,我正在研究Firefox 附加构建者在此类常数声明上偶然发现: const { getCodeForKey, toJSON } = require("../../keyboard/utils"); 我可以找到有关有人可以将我指向一些说明这里发生了什么的规范/草稿吗? 解决方案 这是// Destructuring assignment [a, b] = foo; // Equivalent code a = foo[0]; b = foo[1]; 这是与对象一起工作的方式: // Destructuring assignment {a, b} = foo; // Equivalent code a = foo.a; b = foo.b; 一个更精致的例子: // Destructuring assignment {name: a, address: {line1: b}} = foo; // Equivalent code a = foo
16 2023-11-13
编程技术问答社区
如何将Javascript代码转换为人类可读的操作码或asm?
据我所知,JavaScript代码可以导致JS bytecode或asm指令(如果内部Jit-Compiler能够将代码直接转换为机器指令). 有什么方法可以将JavaScript代码转换为人类可读的JS字节代码(或ASM指令) - 取决于V8引擎的转换吗? 解决方案 您可以使用--print-bytecode --print-opt-code运行D8或节点,以在生成时同时打印字节码和优化的汇编代码.您可以使用--print-bytecode-filter=foo和--print-opt-code-filter=foo如果您只对函数foo感兴趣.您将需要调试构建,或在其args.gn中使用v8_enable_disassembler = true的发行版构建(常规版本构建不包括拆卸器代码以节省二进制尺寸).当功能"热"(即花费一些时间运行)时,将生成优化的代码. 其他解决方案 您可以使用NPM的Bytenode为您的节点应用创建可执行文件.如果要阅读可执行文件,则可
4 2023-11-12
编程技术问答社区
JavaScript垃圾收集器何时及如何工作
我确实阅读了几篇文章,例如 and 这个我得到了如何了解的想法GC发生在JavaScript 中 我仍然不明白 之类的事情 a)垃圾收集器何时开始(在某些时间间隔或某些条件后会被调用)? ? b)谁负责垃圾收集(它是JavaScript引擎或浏览器/节点的一部分)? c)在主线程或单独的线程上运行? d)以下哪一个具有较高的峰值内存使用? // first-case // variables will be unreachable after each cycle (function() { for (let i = 0; i
6 2023-11-12
编程技术问答社区
javascript内部:事件是如何实现的?
我的问题与JS发动机如何实现异步事件的模式有关,当我们执行诸如bind事件处理程序之类的dom上的事件时,请说单击事件? 他们是否有类似单独的线程的东西,正在收听所有点击事件?当事件发生时,它们是否参考绑定列表并冒泡事件? 类似的Ajax是异步网络调用,浏览器跨越一个新线程,该线程将开始侦听服务器中的数据,当收到响应时,它将称为成功处理程序? 解决方案 阅读/a>关于JavaScript事件队列,看看它是否回答了您的大多数问题.将会有一个本机操作系统线程处理与实际OS事件(鼠标事件,键盘事件,计时事件,网络I/O事件等)接口将它们派遣到JavaScript代码. OS级别有多少个单独的线程是特定于实现的,并且可能随实现而有所不同.
6 2023-11-12
编程技术问答社区
如果你在Chrome'的控制台中尝试9n**9n**9n,Chrome会中断(类似于一个无限循环)。为什么会发生这种情况?
如果您在Chrome的控制台中尝试9n**9n**9n,Chrome会断裂(类似于无限循环). V8引擎是否缺乏此案的实施? 我的意思是,如果您尝试9**9**9它将返回Infinity,这很好. 为什么V8返回Infinity在前一种情况下也不是? 为什么它似乎进入无限循环? 我也在Firefox中尝试了此问题,并且此问题不存在,因为当前没有spidermonkey的Bigint实现. 谢谢! 解决方案 已经说过,9n是9的bigint表示. **(POWER)操作员从右到左工作,导致结果快速升级: 2n**2n**2n === 2n ** 4n === 16n 3n**3n**3n === 3n ** 27n === 7625597484987n 4n**4n**4n === 4n ** 256n === 1340780792994259709957402499820584612747936582059239337772356144
6 2023-11-12
编程技术问答社区
v8和SpiderMonkey中的Javascript var vs let(去)优化/减慢问题
在我的项目中重构JavaScript代码期间,我发现我的一些循环大大减慢了.搜索根本原因,我找到了>这个问题指出放缓是由for内部for循环和闭合创建引起的. 令我惊讶的是,移动let并将闭合for循环无济于事,即使使用var而不是let进行循环变量也无济于事> for循环. 通过删除额外的详细信息,我获得了此代码段: 在 "use strict" console.log("========================="); (function(){ var itr = 0; function f(){++itr;} console.time('without_let'); for(var i = 0; i
12 2023-11-12
编程技术问答社区
MongoDB SpiderMonkey不懂UTF-8
如果我在mongoDB数据库中添加了非ASCII字符,则所有db.find()失败了"检测到的非ASCII字符". 这是Spidermonkey的问题,我必须在UTF-8支持下重建它. 我试图像在 http://www.mongodb.org/display/display/display/docs/docs/docs/building+spider+spider+spider+monkey 但是它不起作用(完成所有步骤后,蜘蛛侠键没有安装). 我有Ubuntu 11.04.有人有指导如何使它起作用在那里? 工作指令如何与Google V8一起使工作方式也可以提供帮助. 解决方案 我正在使用此指令进行新的OS安装后,在Ubuntu Server上使用MongoDB: http://www.mongodb.org/display/docs/ubuntu+and+debian+packages 盒子里一切都很好.从头开始构建mongodb对您至关重要吗?
14 2023-11-12
编程技术问答社区
在引擎盖下,Javascript对象是哈希表吗?
我想知道如何在JavaScript引擎(V8,SpidermonKey等)中的引擎盖下实现对象.他们真的只是散布桌子吗?如果是这样,他们如何处理碰撞? 解决方案 首先,对于不同的JS发动机而言,答案可能有些不同.另外,我认为您是专门询问属性存储的;显然,对象也有很多其他状态(原型链链接是一个显而易见的链接). 对于SpidermonKey,对象基本上具有链接的列表(有关属性的信息)对,直到它们具有太多属性为止,当我相信它们仍然保留链接列表时练习),但添加一个宽带的标签,将属性名称映射到链接列表中的条目. 可能还有其他原因可以切换到Hashtable;详细信息尚未完全固定,并且可能会在将来发生变化. 实际上在对象之间共享了链接的列表和哈希词.只要两个对象具有相同的属性名称和相应的属性信息(不包括值,对于存储值的属性),并且属性以相同的顺序设置,他们就可以共享属性链接的列表. 实际属性值需要存储时,将存储在对象中的数组中(或更确切地说是两个数组;一个与对象分配
14 2023-11-12
编程技术问答社区
Javascript引擎的优势
我现在对JavaScript引擎感到困惑.我知道 v8 很重要,因为它将JavaScript汇编为本机代码. 然后,我开始阅读有关 mozilla spidermonkey 我了解的是用C编写的,可以编译JavaScript.那么这与V8有何不同,如果这是真的,为什么Firefox不这样做? 最后,做 rhino 实际上是将Javascript编译为JavaScript到Java Byte代码会获得Java的所有速度优势吗?如果不是,为什么人们在桌面上编写脚本时不运行V8? 解决方案 即使在执行JIT时,JavaScript执行也有多种方法. V8和Nitro(以前称为松鼠极端)选择进行全方法JIT,这意味着它们在遇到脚本时将所有JavaScript代码汇编为本机说明,然后简单地执行该脚本,就好像是编译了C代码一样. SpidermonKey使用"跟踪" JIT,该JIT首先将脚本编译以字节码并解释它,但是监视执行,寻找"热点",例如循环.当它检测到一个时,它将仅编译
8 2023-11-12
编程技术问答社区
ES6地图和集合:如何有效地对对象键进行索引?
在ES6中,地图和集合可以使用对象作为密钥.但是,由于ES6规范不决定这些数据构建的基本实现,因此我想知道现代JS发动机如何存储键,以保证O(1)或至少在像Java这样的语言中,程序员可以明确提供(良好的)主题方法,该方法可以在关键空间中均匀地哈希键,以确保性能.但是,由于JS没有这样的功能,仍然可以假设他们在地图中使用某种散列并设置实现吗? 任何信息都将不胜感激! 解决方案 是的,实现基于哈希,并且具有(摊销)持续的访问时间. "他们使用对象身份"是简化的;完整的故事是,ES地图和集合使用 samevaluezero 用于确定平等的算法./p> 与此规范一致,V8的实现计算字符串和数字的"真实"哈希,并选择一个随机数作为对象的"哈希",它将其作为这些对象上的私有(隐藏)属性存储在这些对象上,以供以后访问. (这不是很理想,并且可能会在将来发生变化,但是现在就是这样.) 使用memoryAddress % keySpace无法工作,因为垃圾收集器会移动对象,并
2 2023-11-12
编程技术问答社区
创建函数会消耗更多内存吗
// Case A function Constructor() { this.foo = function() { ... }; ... } // vs // Case B function Constructor() { ... }; Constructor.prototype.foo = function() { ... } 人们建议使用原型的主要原因之一是,在使用其他方法时,在原型中创建了一次.foo. 但是,人们会期望口译员可以优化这一点.因此,如果a. ,函数foo只有一个副本 当然,您仍然会为每个对象具有唯一的范围上下文,因为封闭的开销少于每个对象的新功能. 现代JS解释器优化案例A是否只有一个函数的副本foo? 解决方案 是的,创建功能使用更多内存. ...而且,不,口译员不会优化案例a降低到一个功能. 原因是 JS范围范围链需要函数的每个实例来捕获可用的变量它在创建时.也就是说,现代口译员 mozi
16 2023-11-12
编程技术问答社区
将发挥作用。原型bind()总是很慢吗?
我正在编写一个开源的JavaScript库,并且我用.bind()方法大量使用,因为我有一个想法,即面向对象的代码看起来更清晰. (值得期待的) 示例 a1: var that = this; setTimeout(function () { that.method(); }, 0); vs b1: setTimeout(this.method.bind(this), 0); 或更实用的代码部分 a2: remoteDataSource.getData(function (a, b, c, d) { obj.dataGetter(a, b, c, d); }) vs b2: remoteDataSource.getData(obj/* or prototype */.dataGetter.bind(obj)); 我为较旧的浏览器使用非本地bind,直到我打开 jsperf Benchmark用于绑定.
8 2023-11-12
编程技术问答社区
编写高性能的Javascript代码,而不至于被取消优化
在JavaScript中编写具有大型数字阵列的javaScript(想想线性代数软件包,在整数或浮点数数字上运行)时,人们总是希望JIT尽可能多地提供帮助.大致意味着: 我们始终希望我们的阵列被包装成SMI(小整数)或包装双打,具体取决于我们是在进行整数还是浮点计算. 我们总是希望将相同类型的事物传递给函数,以免它们被标记为"巨型型"并消除.例如,我们始终希望用x>和y填充SMI数组或两个包装的双阵列. 我们希望函数尽可能被嵌入. 当一个案例之外的一个流浪时,会发生突然而剧烈的性能下降.这可能出于各种无害原因而发生: 您可能会通过看似无害的操作将包装的SMI数组变成一个包装的双阵列,例如myArray.map(x => -x)的等效.这实际上是"最佳"坏案例,因为包装的双阵列仍然非常快. 您可以将包装的数组变成通用的盒装数组,例如,通过(意外)返回null或undefined的函数将数组映射到一个函数.这个坏病很容易避免. 您可以通过传递太多类型的事物并将其转动
6 2023-11-12
编程技术问答社区