2017-03-17 14 views
1

を使用してJSを実行しているとき、私はJavaでたScriptEngineを経由していくつかの簡単なJavaScript関数を実行しようとしているが、私は次のエラーを取得しています:「例外TypeError:関数マップが見つかりません」のJavaたScriptEngine

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function map. (<Unknown source>#8) in <Unknown source> at line number 8 
at com.sun.script.javascript.RhinoScriptEngine.invoke(RhinoScriptEngine.java:230) 
at com.sun.script.javascript.RhinoScriptEngine.invokeFunction(RhinoScriptEngine.java:188) 
at com.example.TestClass.main(TestClass.java:96) 

私のコード:

test.js

function getRoots() { 
    var numbers = [1, 4, 9]; 
    var roots = numbers.map(Math.sqrt); 

    println(roots); 
} 

TestClassをメイン方法

public static void main(String[] args) throws IOException, InvalidFormatException, ScriptException, NoSuchMethodException { 
     ScriptEngineManager factory = new ScriptEngineManager(); 
     ScriptEngine engine = factory.getEngineByName("JavaScript"); 
     engine.eval(new FileReader("C:/path/to/my/js/file/test.js")); 

     Invocable inv = (Invocable) engine; 

     inv.invokeFunction("getRoots"); 
} 
012なぜそのコードを実行するときに見つからない map機能は次のとおりです。

エラーがvar roots = numbers.map(Math.sqrt);

私は理解していないことである行に表示されますか?

答えて

1

ほとんどの場合、Array#mapをサポートしていない旧バージョンのRhinoエンジンを使用している可能性があります。 Array#mapがバージョン1.6のJavaScriptに追加され、最新のRhino がJavaScript 1.7をサポートするはずです。あなたのエンジンがArray#mapをサポートしていない、あなたはそれのためのサポートを追加するMDN documentationでポリフィルを使用することができるはずです理由が何であれ

// Production steps of ECMA-262, Edition 5, 15.4.4.19 
// Reference: http://es5.github.io/#x15.4.4.19 
if (!Array.prototype.map) { 

    Array.prototype.map = function(callback/*, thisArg*/) { 

    var T, A, k; 

    if (this == null) { 
     throw new TypeError('this is null or not defined'); 
    } 

    // 1. Let O be the result of calling ToObject passing the |this| 
    // value as the argument. 
    var O = Object(this); 

    // 2. Let lenValue be the result of calling the Get internal 
    // method of O with the argument "length". 
    // 3. Let len be ToUint32(lenValue). 
    var len = O.length >>> 0; 

    // 4. If IsCallable(callback) is false, throw a TypeError exception. 
    // See: http://es5.github.com/#x9.11 
    if (typeof callback !== 'function') { 
     throw new TypeError(callback + ' is not a function'); 
    } 

    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. 
    if (arguments.length > 1) { 
     T = arguments[1]; 
    } 

    // 6. Let A be a new array created as if by the expression new Array(len) 
    // where Array is the standard built-in constructor with that name and 
    // len is the value of len. 
    A = new Array(len); 

    // 7. Let k be 0 
    k = 0; 

    // 8. Repeat, while k < len 
    while (k < len) { 

     var kValue, mappedValue; 

     // a. Let Pk be ToString(k). 
     // This is implicit for LHS operands of the in operator 
     // b. Let kPresent be the result of calling the HasProperty internal 
     // method of O with argument Pk. 
     // This step can be combined with c 
     // c. If kPresent is true, then 
     if (k in O) { 

     // i. Let kValue be the result of calling the Get internal 
     // method of O with argument Pk. 
     kValue = O[k]; 

     // ii. Let mappedValue be the result of calling the Call internal 
     //  method of callback with T as the this value and argument 
     //  list containing kValue, k, and O. 
     mappedValue = callback.call(T, kValue, k, O); 

     // iii. Call the DefineOwnProperty internal method of A with arguments 
     // Pk, Property Descriptor 
     // { Value: mappedValue, 
     // Writable: true, 
     // Enumerable: true, 
     // Configurable: true }, 
     // and false. 

     // In browsers that support Object.defineProperty, use the following: 
     // Object.defineProperty(A, k, { 
     // value: mappedValue, 
     // writable: true, 
     // enumerable: true, 
     // configurable: true 
     // }); 

     // For best browser support, use the following: 
     A[k] = mappedValue; 
     } 
     // d. Increase k by 1. 
     k++; 
    } 

    // 9. return A 
    return A; 
    }; 
} 
+0

あなたは絶対的に正しいです。ありがとう! – peterremec

関連する問題