参考
http://www.cnblogs.com/yesun/archive/2008/04/02/1134041.html
http://heisetoufa.iteye.com/blog/227714
package com.kaixin001.common;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;
public class ScriptHelper {
private Context cx;
private Scriptable scope;
public ScriptHelper() {
this.cx = Context.enter();
this.scope = cx.initStandardObjects();
}
public Object runJavaScriptByFile(String filename) {
String jsContent = this.getJsContent(filename);
Object result = cx.evaluateString(scope, jsContent, filename, 1, null);
return result;
}
public Object runJavaScript(String jsContent) {
Object result = cx.evaluateString(scope, jsContent, "", 1, null);
return result;
}
private static String getJsContent(String filename) {
LineNumberReader reader;
try {
reader = new LineNumberReader(new FileReader(filename));
String s = null;
StringBuffer sb = new StringBuffer();
while ((s = reader.readLine()) != null) {
sb.append(s).append("\n");
}
return sb.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public Scriptable getScope() {
return scope;
}
public static void main(String[] args) throws FileNotFoundException, IOException {
String filename = System.getProperty("user.dir") + "/acc.htm";
// String pattern = "";
String accCode = "";
String script = "";
String script_tmp2 = "";
String var_values = "";
// 得到所有script段
Pattern pattern = Pattern.compile("<script type=\"text/javascript\">.*?</script>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(getJsContent(filename));
String jsContent = "";
while (matcher.find()) {
String js = matcher.group();
if(js.contains("function acc()")) {
jsContent = js.replaceAll("<.*?script.*?>", "");
//System.out.println(jsContent);
}
}
String jsFunction = "acc";
// 开始调用javascript函数
Context cx = Context.enter();
try {
Scriptable scope = cx.initStandardObjects();
cx.evaluateString(scope, jsContent, null, 1, null);
Object fObj = scope.get(jsFunction, scope);
if (!(fObj instanceof Function)) {
System.out.println("找不到方法" + jsFunction);
} else {
Function f = (Function) fObj;
Object result = f.call(cx, scope, scope, null);
System.out.println("返回结果:" + Context.toString(result));
}
} finally {
Context.exit();
}
}
}
分享到:
相关推荐
### JavaScript函数大全详解 在JavaScript编程语言中,各种内置函数为开发者提供了强大的工具箱,用于处理数字、字符串、数组以及日期等数据类型。本文将详细解释部分常用的JavaScript函数及其应用场景,帮助开发者...
`reduceRight` 的回调函数接收两个参数:上一次调用的结果(`acc`)和当前遍历到的函数(`fn`)。每次迭代都将 `fn(acc)` 的结果赋值给 `acc`,最后返回 `x` 作为整个链条的起点。 - **闭包实现**: ```...
acc 函数的更通用版本,它累积先前调用中的参数(包括错误)。用法 var acc = require ( 'acc' ) var fn = acc ( 2 , function ( a , b , c ) { // This function is being invoked after two calls of fn() // ...
在JavaScript中,我们可以编写函数来计算任意正整数的阶乘。 标题中的“jiecheng.rar_javascript”很可能是一个关于使用JavaScript实现阶乘计算的示例代码,其中“jiecheng.html”可能是展示这个功能的HTML页面,...
本文将深入探讨JavaScript中的一些关键概念,包括构造函数、JSON格式的字符串与对象之间的转换,以及如何操纵`this`指向。 一、数组操作: 在JavaScript中,我们可以轻松地对数组进行各种操作。例如,要找到数组`...
6. **尾调用优化**:虽然JavaScript的实现并非都支持尾调用优化,但在ES6中引入了这个概念,可以防止递归深度过大导致栈溢出。 7. **数组方法**:JavaScript的数组方法如`map`, `filter`, `reduce`, `forEach`等,...
JavaScript中的高阶函数是其灵活性和强大的功能之一,它允许函数作为其他函数的参数或返回结果。这样的特性使得代码更加模块化,提高了代码的重用性和可读性。以下是几个高阶函数的应用场景: 1. **回调函数**: ...
尾叫tailcall是一个browserify转换和命令行实用程序,可用于消除递归函数中的尾部调用(TCO =尾部调用优化)。 这样可以防止使用的调用堆栈过度增长,并且通常可以提高性能(在大多数情况下)。 尾调用优化是...
默认参数允许我们在定义函数时为参数提供一个默认值,如果调用函数时不传递该参数,则使用默认值: ```typescript function greet(name: string, greeting = 'Hello') { return `${greeting}, ${name}!`; } ``` ...
通过理解JavaScript中函数调用的传值和传址机制,开发者可以更好地控制函数行为,避免意外的副作用,并有效地利用高级特性如默认参数、剩余参数和闭包。在编写复杂的JavaScript代码时,这些概念起着关键的作用。
带尾调用的原始函数: function counter ( n , acc = 0 ) { if ( n === 0 ) { return acc } else { return counter ( n - 1 , acc + 1 ) }} 被重写为: function counter ( n , acc = 0 ) { var _repeat = true ;...
在加法操作中,`accAdd`函数处理了不同浮点数的小数位数,确保了在相加时保持正确的精度。它通过创建一个足够大的基数来存储最精确的小数位数,然后进行相应的计算。同样,我们通过添加`.add`方法到Number原型,使得...
在这个面试题中,应聘者需要实现一个`compose`函数,它允许开发者将多个单参数函数组合成一个新的复合函数,从右到左顺序执行这些函数,将前一个函数的结果传递给后一个函数作为参数。 首先,让我们深入理解`...
JavaScript中的尾调用优化(Tail Call Optimization,简称TCO)是一种优化策略,旨在提高递归函数的性能。在JavaScript中,当一个函数的最后一步是调用另一个函数,并且返回该调用的结果时,我们称这个调用为“尾...
3. **加法函数(accAdd)**: 加法函数处理了两个数字可能存在的不同小数位数。它找到最大小数位数,创建一个乘数 `m = Math.pow(10, Math.max(t1, t2))`,然后将两个参数分别乘以 `m` 后相加,再除以 `m`,以得到...
eslint-plugin-func-params-args ... 假设我们需要调用array.reduce ,有时需要在箭头函数表达式中使用所有提供给 reducer 回调的 4 个参数(如array.reduce((acc, val, index, arr) => {}, {})例如
首先,`apply`方法是JavaScript中Function对象的一个实例方法,它的主要作用是改变函数调用时的上下文(即`this`的指向)并可以接受一个数组或类数组对象作为参数传递给函数。例如: ```javascript function sum(a,...
- 箭头函数的 `this` 值取决于定义时所在的上下文,而不是调用时的上下文,这使得在某些场景下更容易管理。 #### 3. 函数参数默认值 ES6 允许开发者直接在函数声明时设置参数的默认值。这使得函数更具可读性和灵活...
闭包是JavaScript编程中一个核心概念,它指的是一个函数能够访问并操作其外部作用域中的变量,即使这个函数在其外部作用域已经不再执行。闭包通常涉及自由变量,即在函数内部使用的,既不是函数参数也不是函数局部...