最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年06月02日 15:24:04   作者:司徒正美  
其中的Script對象,就與require('vm')返回的對象很相似,而實質(zhì)上,vm模塊就是對Script對象的封裝。

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: 212ms
vm.runInNewContext: 2222ms
script.runInThisContext: 6ms
script.runInNewContext: 1876ms
script.runInContext: 44ms
fn: 0ms
 
*/

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

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

相關(guān)文章

  • 你所未知的3種Node.js代碼優(yōu)化方式

    你所未知的3種Node.js代碼優(yōu)化方式

    這篇文章主要為大家介紹了3種你所未知的Node.js代碼優(yōu)化方式,幫助大家剛好的進行代碼優(yōu)化,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Node+Express連接MySQL實現(xiàn)增刪改查功能

    Node+Express連接MySQL實現(xiàn)增刪改查功能

    這篇文章主要為大家詳細介紹了Node如何結(jié)合Express連接MySQL實現(xiàn)增刪改查功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-05-05
  • 詳解使用Visual Studio Code對Node.js進行斷點調(diào)試

    詳解使用Visual Studio Code對Node.js進行斷點調(diào)試

    這篇文章主要介紹了詳解使用Visual Studio Code對Node.js進行斷點調(diào)試,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Node.js中path模塊操作路徑的基本使用

    Node.js中path模塊操作路徑的基本使用

    這篇文章主要介紹了Node.js中path模塊操作路徑的基本使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Node.js 使用遞歸實現(xiàn)遍歷文件夾中所有文件

    Node.js 使用遞歸實現(xiàn)遍歷文件夾中所有文件

    這篇文章主要介紹了Node.js使用遞歸實現(xiàn)遍歷文件夾中所有文件,需要的朋友可以參考下
    2017-09-09
  • Node.js實現(xiàn)壓縮與解壓數(shù)據(jù)

    Node.js實現(xiàn)壓縮與解壓數(shù)據(jù)

    這篇文章介紹了Node.js實現(xiàn)壓縮與解壓數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 基于node簡單實現(xiàn)RSA加解密的方法步驟

    基于node簡單實現(xiàn)RSA加解密的方法步驟

    這篇文章主要介紹了基于node簡單實現(xiàn)RSA加解密的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Node.js如何提取文件中的中文字符

    Node.js如何提取文件中的中文字符

    這篇文章主要介紹了Node.js如何提取文件中的中文字符,本文介紹了在Node.js開發(fā)中如何使用代碼提取文件中的中文字符,幫助開發(fā)者更好地處理中文文本數(shù)據(jù),提高開發(fā)效率
    2023-05-05
  • node.js包管理工具Yarn使用簡介

    node.js包管理工具Yarn使用簡介

    這篇文章介紹了JS包管理工具Yarn的基本用法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Node使用Nodemailer發(fā)送郵件的方法實現(xiàn)

    Node使用Nodemailer發(fā)送郵件的方法實現(xiàn)

    這篇文章主要介紹了Node使用Nodemailer發(fā)送郵件的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02

最新評論

沾益县| 屏东县| 周宁县| 湖南省| 邵阳县| 石楼县| 桑日县| 海兴县| 泰来县| 松潘县| 汶上县| 大港区| 昆明市| 达州市| 河北省| 湖口县| 简阳市| 宜良县| 独山县| 察哈| 建瓯市| 台东市| 泊头市| 徐汇区| 汤阴县| 蚌埠市| 高安市| 宜州市| 连州市| 宁津县| 藁城市| 剑阁县| 呼伦贝尔市| 鲁甸县| 余庆县| 荣昌县| 静安区| 额敏县| 济源市| 新干县| 寿阳县|