这种说法我听过很多次,但我个人认为这不太有道理。我认为人们混淆了作为语言规范的 JavaScript 和实践中的 JavaScript(浏览器、Node 等)。当然在大多数情况下 JavaScript 是在单线程环境中执行的;但 AFAIK 语言规范中没有任何内容要求如此。我认为这就像说 Python 是“可解释的”,而实际上这完全是一个实现问题。
那么,说 JavaScript 是一种“单线程”语言是否准确?
最佳答案
您所说的 JavaScript 似乎是指 ECMAScript。
浏览器中已经有了多线程,使用 webworkers 构建,并且基于数据的强隔离:工作人员仅通过消息传递进行通信,不共享任何内容。
如果您想要更复杂的多线程处理和数据共享,那么现在看来不可能。 ECMAScript 中没有任何内容明确禁止多线程,但如果没有,您就无法进行多线程
事实上 ECMAScript 并未设计为包含多线程,目前足以阻止它支持它(除了已经完成的消息传递隔离多线程,但它是一种非常有限的多线程) .
你必须意识到这一点
为什么我说你很少使用它?因为大部分 IO 阻塞任务(文件读取、请求、数据库查询等)、大部分低级任务(例如图像解码或页面渲染)、大部分 UI 管理(使用事件队列)、大部分调度(超时和间隔)是在外面为你完成的。
关于javascript - 说 JavaScript 是一种 "single-thread"语言准确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17542740/
我想了解这里发生了什么。警告是不言自明的,我意识到在应用程序中,使用下面的代码和结构,它会运行ng-view两次('test'将在控制台中记录两次,所以Angular当然会加载两次!)....但为什么?我已经阅读了所有我能找到的关于它的帖子,它似乎归结为在angular之前加载jQuery。如果我遗漏了jQuery或者如果我在angualr之后加载jQuery(据我所知这不是好的做法),没问题。我想让jQuery支持某些功能(特别是ui-sortable)。而且,虽然它似乎并没有真正引起任何问题,但我不想让它运行我的ng-view两次。我是不是在结构上做错了什么,或者我是否缺少解决此问
我想使用这个流行的模板:http://getbootstrap.com/examples/navbar/我不想链接到about.htm或contact.htm,此内容应该在模板内(多页/div)。这一定是这个样子:home...about...contact...但是如何从导航标签“链接”到div?这行不通:HomeAboutContact非常感谢! 最佳答案 您需要使用JavaScript和JQuery来执行此操作。有多种方法可以实现这一目标。选项1创建一个index.html,指定一个并将其留空。然后用jQuery加载home.
我正在尝试使用语义ui创建一个简单的webui。我想要一个带有菜单的侧边栏,在某些项目中会有子项目......应该不会那么难吧?http://jsfiddle.net/ycm8ctfx/ExampleMessages如何让子项目在正常页面内容上“飞出”侧边栏?如果您在示例中单击“消息”,将出现菜单(观察底部出现的滚动条),但由于它们是侧边栏的子项,因此它们显示在侧边栏中。但我希望它们漂浮在正常内容上!我没有通过摆弄z-index来让它工作。 最佳答案 如果侧边栏被配置为使用overlay过渡,它可以通过指定来修复.ui.sideba
想用javascript测试如果浏览器支持类型化数组http://caniuse.com/#feat=typedarrays我试过了,但似乎不是好方法,因为有些浏览器只提供部分支持..:if(window.ArrayBuffer){alert('typedarraysupported')} 最佳答案 似乎有些浏览器(IE10)不支持Uint8ClampedArray,如果这是您打算使用的功能,您可以检查一下if('Uint8ClampedArray'inwindow){...如果检查返回false,则不支持类型化数组和/或限定数组。
我正在使用Jasmine2.1。我正在尝试使用Jasmine2.1来测试模块。我的模块之一具有异步执行代码的功能。当应用程序完成执行时,我需要测试函数的结果。有没有办法做到这一点?目前,我的模块看起来像这样:varotherModule=require('otherModule');functionMyModule(){}MyModule.prototype.state='';MyModule.prototype.execute=function(callback){try{this.state='Executing';varm=newotherModule.Execute(funct
我是计算机科学专业的学生,我们正在用javascript做练习,练习是:“用ID为“numberFour”且文本为“Mistreatment”的新项目替换项目编号4。”这是我做练习之前的样子:第一:寻找伴侣第二:无聊第三:缺乏服从第四:虐待第五点:寻求伙伴关系然后我写了这段js代码来完成作业:varvier=document.createElement("li");vier.innerHTML="Numberfour:Mistreatment";vier.setAttribute("id","numberFour");varlijst=document.querySelector(
我有一个自定义事件core-transitionend(实际上由Polymer触发),我可以使用document.addEventListener()设置事件处理程序.但在AngularJS中执行此操作的最佳做法是什么?或者,我可以在DOM中明确设置一个处理程序,即,但是如何在AngularJS中定义这个函数呢? 最佳答案 参见thisfiddle,我在这里创建了一个自定义指令,它将事件绑定(bind)到元素,angular.module('HelloApp',[]).directive('customDir',function
在某些情况下,提倡组合而不是继承。我看到这种情况在Ruby和Javascript社区中越来越多地发生。组合听起来很像多重继承。我什至在一些Ruby实现的内部读到过,模块组合是带有少量语法糖的多重继承。是一样的吗?如果不是,它与多重继承有何不同? 最佳答案 这取决于您所说的“多重继承”和“组合”是什么意思。如果组合和继承都只是意味着添加到对象响应的消息列表中,那么它们在定义上是相等的。假设类很简单virtualtables方法,并且语言中的每个对象都是由对类和一些数据的引用定义的。如果对象通过调用与其类关联的方法查找函数来响应消息,并
在AngularJS应用程序中,我对服务器url进行$http.post调用。此url的成功响应是30x重定向,我的问题是$http.post严格遵循此重定向并在成功回调中返回最终调用的结果。我想拦截此重定向并手动将用户重定向(更改浏览器url)到最终页面。可能吗? 最佳答案 根据docs,$http服务是一个核心Angular服务,它通过浏览器的XMLHttpRequest对象或通过JSONP促进与远程HTTP服务器的通信。了解这一点,并了解XMLHttpRequest的规范,拦截重定向可能是不可能的。W3CspecforXMLH
转发似乎在Meteor中,我们无法调用服务器端路由来将文件呈现到页面,而无需从我们的正常工作流程中进行某种变通,根据我所阅读的有关服务器端路由的内容。我希望我在这一点上是错的,并且有一种简单的方法可以实现我想要做的事情......**抱歉,如果这有点长,但我认为在这种情况下提供更多的背景和上下文是必要的**软件/版本我正在使用最新的IronRouter1.*和Meteor1.*并且开始时,我只使用帐户密码。背景/语境我有一个onBeforeAction,它只是根据用户是否登录将用户重定向到欢迎页面或主页:两者/routes.jsRouter.onBeforeAction(functio