动态执行javascript代码的几种方法介绍

在nodejs里面我们要用js来执行js,大概有这几个方式:

1.runInThisContext

我们先看代码和输出:

var vm = require(‘vm‘);
var localVar=1;
globalVar = 0;
var script = vm.createScript(‘globalVar += 1;localVar=3‘, ‘this.vm‘);
for (var i = 0; i < 1000 ; i += 1) {
    script.runInThisContext();
}
console.log(globalVar);
console.log(localVar);
console.log(global.localVar);

代码输出:

1000
1
3

从这里我们可以看到runInThisContext是不能访问本地作用域的,但是可以访问golbal(nodejs全局作用域),所以它改变globalVar为1000,而本地localVarl=3相当于在global作用域里声明里一个localVar变量并设置为3.本地作用域里的localVar则继续为1.

2.runInNewContext

我们再看代码和输出:

var vm = require(‘vm‘);
var localVar=1;
globalVar = 0;
var sandbox = { sanboxVar:0 };
var scriptNew=vm.createScript(‘sanboxVar += 1;globalVar=4;var x=2;‘, ‘new.vm‘);
for (var i = 0; i < 1000 ; i += 1) {
    scriptNew.runInNewContext(sandbox);
}
console.log(sandbox.sanboxVar);
console.log(sandbox.globalVar);
console.log(sandbox.x);
console.log(globalVar);

代码输出:

1000
4
2
0

我们看到runInNewContext则是完全在一个新的作用域里面执行代码,即不能访问本地作用域,也不能访问全局作用域,但是可以通过传入一个沙箱来获取一些执行结果,比如这里‘sanboxVar += 1;globalVar=4;var x=2;‘,无论是在sandbox被传入的sanboxVar属性,还是globalVar这样直接赋值的变量或者新建并赋值的变量x,最后都被设置成了sanbox的属性。

3.eval

最后我们看看eval的代码:

var localVar=1;
globalVar = 0;
eval(‘globalVar=3;localVar=2‘);
console.log(globalVar);
console.log(localVar);

代码输出

3
2

说明eval既可以访问本地作用域,也可以访问global全局作用域,上面的代码其实跟:

var localVar=1;
globalVar = 0;
globalVar=3;localVar=2;
console.log(globalVar);
console.log(localVar);

这个代码完全一样,就跟直接执行js一样。

好了,到这里基本上说明白用 runInThisContext,runInNewContext,eval三种方式执行代码的异同,大家可以根据自己的需求来选择使用:)

扫描下面二维码图片选择“识别图中二维码”关注帝都码仔公众号:

时间: 2024-10-13 00:27:34

动态执行javascript代码的几种方法介绍的相关文章

WebDriver提供了executeScript()方法来执行JavaScript代码

WebDriver提供了executeScript()方法来执行JavaScript代码 业务场景: 打开百度网页,隐藏百度一下按钮,因为里面涉及到按钮的属性,所以要用js. 方法: (JavascriptExecutor)driver.executesScript();

js 动态加载事件的几种方法总结

本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添加事件,这就涉及到浏览器兼容性问题了,以下谈及的几种方法,我们也常常混合使用. 方法一.setAttributevar obj = document.getElementById("obj");obj.setAttribute("onclick", "javasc

C#执行javascript代码

最近在做网站自动登陆小工具,遇到技术屏障.密码在submit时会使用js进行加密.这时我需要模拟这个加密过程,想到使用C#执行javascript代码. 对于执行javascript代码,纯代码方式使用如下两种方式. 1.Google Chrome V8引擎 Google Chrome V8引擎在.NET上的封装,功能完善,性能相对较高.地址: http://javascriptdotnet.codeplex.com/ using Noesis.Javascript; using System;

在delphi中执行javascript代码

http://lhdeyx.blog.163.com/blog/static/318196972011101132922916/ 在delphi中执行javascript代码 2011-11-11 15:32:54|  分类: delphi|举报|字号 订阅 下载LOFTER我的照片书  | 有时做项目难免用到代码交叉调用,delphi中执行js就是一种,两种方法可用:一.使用webbrower,比较麻烦二.使用ScriptControl,简单方便:1.首先uses ComObj;2.通用函数:

转:selenium webdriver 执行javascript代码

在用selenium webdriver 编写web页面的自动化测试代码时,可能需要执行一些javascript代码,selenium本身就支持执行js,我们在代码中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScript.executeAsyncScript这两个方法了,其中executeScript是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕:executeAsyncScript方法是异步方法,它不

用C#从数据库动态生成AdminLTE菜单的一种方法

用C#从数据库动态生成AdminLTE菜单的一种方法 当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://github.com/JackWangCUMT/AdminLTE-Menu-Generate.首先看一下主界面: 查看左边导航的菜单html结构(下面代码有错误,HTML自定义属性直接用空格进行分割,而不是,号进行分割,不然jquery获取定义属性

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把查询结果的 HTML 代码呈现到 Razor 视图中,考虑到灵活性,需要能在任意 Razor 视图中调用该方法,这样任意 Razor 页面都能以统一的方式方便地共享该页面部件的 HTML 内容,这对于代码的重用性和可维护性都是非常有必要的. 为实现上述要求,本文介绍如下可供选择的三种方式.   1.

ABAP 动态生成内表的几种方法

最近要写个程序,既有更新的,也有删除的,需要涉及到很多系统表,如果一个表一个表进行更新或者删除太慢了,于是就想通过创建动态内表来实现这些功能,在网上找了一些资料,经过多次尝试,终于测试成功了.网上讲述的创建动态内表的方法大致有两种.我做了一下测试,源代码附后.在这里提醒大家一点,在做动态更新程序的时候,要注意两点:      1.使用modify (p_tabname) from <dyn_wa>. 的时候,一定要确定要更新的字段是不是系统表的关键字段,如果是关键字段的话,需要先删除这条记录,

WPF编程,通过Double Animation动态旋转控件的一种方法。

原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/87259162 ? ?1.控件旋转,可直接调用.需要将控件的名称,旋转的角度,时间等参数传进去. /// <summary> /// 控件绕中心旋转动画 /// </summary> /// <param name="element"