国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

node.js 動態(tài)執(zhí)行腳本

2019-11-20 09:49:17
字體:
來源:轉載
供稿:網(wǎng)友

node.js最近新增了虛擬機模塊,其實也不能說是新增的,只是把一些內(nèi)部接口暴露出來罷了,從2.x就有了。我們可以從node / src / node.js看到這些代碼:

var Script = process.binding('evals').NodeScript;var runInThisContext = Script.runInThisContext;  NativeModule.wrap = function(script) {  return NativeModule.wrapper[0] + script + NativeModule.wrapper[1]; };  NativeModule.wrapper = [  '(function (exports, require, module, __filename, __dirname) { ',  '/n});' ];  NativeModule.prototype.compile = function() {  var source = NativeModule.getSource(this.id);  source = NativeModule.wrap(source);   var fn = runInThisContext(source, this.filename, true);  fn(this.exports, NativeModule.require, this, this.filename);   this.loaded = true; };

其中的Script對象,就與require('vm')返回的對象很相似,而實質(zhì)上,vm模塊就是對Script對象的封裝。

var Script = process.binding('evals').NodeScript;console.log(Script)/**{ [Function: NodeScript] createContext: [Function], runInContext: [Function], runInThisContext: [Function], runInNewContext: [Function] } */console.log(require('vm')){ Script:   { [Function: NodeScript]   createContext: [Function],   runInContext: [Function],   runInThisContext: [Function],   runInNewContext: [Function] }, createScript: [Function], createContext: [Function], runInContext: [Function], runInThisContext: [Function], runInNewContext: [Function] }

其中,runInThisContext 相當于一個全新的環(huán)境中執(zhí)行代碼,不會影響當前作用域的對象。而runInNewContext與runInContext則能指定是上下文對象,區(qū)別是一個普通對象或一個context對象。換言之,runInNewContext與runInContext能局部影響當前作用域的對象。要與當前環(huán)境完全進行交互的話,就需要用到危險的eval。在node.js自帶的加載體系中,顯然沒有這樣的勇氣,使用的是runInThisContext。并且在這之前做了許多工作,如把用戶的JS文件里面的內(nèi)容再包一層( NativeModule.wrap),還有其他凌散操作,加之是同步操作,實際上是一種效率很糟的加載方式。唯一的好處是,使用了同步,讓代碼編寫起來簡單多了。

在github中,已有人對這幾種動態(tài)執(zhí)行腳本的方法進行性能比較:

var vm = require('vm'), code = 'var square = n * n;', fn = new Function('n', code), script = vm.createScript(code), sandbox; n = 5;sandbox = { n: n }; benchmark = function(title, funk) { var end, i, start; start = new Date; for (i = 0; i < 5000; i++) {  funk(); } end = new Date; console.log(title + ': ' + (end - start) + 'ms');} var ctx = vm.createContext(sandbox);benchmark('vm.runInThisContext',   function() { vm.runInThisContext(code); });benchmark('vm.runInNewContext',   function() { vm.runInNewContext(code, sandbox); });benchmark('script.runInThisContext', function() { script.runInThisContext(); });benchmark('script.runInNewContext', function() { script.runInNewContext(sandbox); });benchmark('script.runInContext', function() { script.runInContext(ctx); });benchmark('fn',           function() { fn(n); });/**vm.runInThisContext: 212msvm.runInNewContext: 2222msscript.runInThisContext: 6msscript.runInNewContext: 1876msscript.runInContext: 44msfn: 0ms */

由此可見,還是v8自帶的方法Function完勝!

以上就是本文的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 义乌市| 衡南县| 宁远县| 罗田县| 墨脱县| 同仁县| 焦作市| 乐平市| 炎陵县| 图们市| 秭归县| 宜州市| 南康市| 郧西县| 杭锦后旗| 利辛县| 平度市| 泰兴市| 平果县| 富蕴县| 江西省| 布尔津县| 贵港市| 吴川市| 田林县| 汤原县| 墨玉县| 景谷| 交口县| 四川省| 隆化县| 万荣县| 聂拉木县| 江油市| 黎川县| 色达县| 哈尔滨市| 姚安县| 阿瓦提县| 新沂市| 东阿县|