I want my users to be able to use JavaScript as a scripting language inside my JavaScript application. To do this, I need to dynamically execute the source code.
There seem to be two main options for dynamically executing JavaScript:
a) Use the method eval(...)(or var func = new Function(...);).
b) Add a <script>node to the DOM (e.g. using $('body').append(...)).
Both methods work fine as long as I don't use any operators importin the dynamically executable source code. If I include instructions import, I get an error message Unexpected identifier.
Example user source code:
import Atom from './src/core.atom.js':
window.createTreeModel = function(){
var root = new Atom('root');
root.createChildAtom('child');
return root;
}
:
a) eval
var sourceCode = editor.getText();
window.createTreeModel = undefined;
eval(sourceCode);
var model = window.createTreeModel();
treeView.setModel(model);
b) DOM:
var sourceCode = editor.getText();
window.createTreeModel = undefined;
var script = "<script >\n"+
sourceCode + "\n" +
"</script>";
$('body').append(script);
var model = window.createTreeModel();
treeView.setModel(model);
script type="application/javascript" b), Unexpected identifier. type="module", . script DOM, .
, . , script , type='module'. type="application/javascript", ... ... import .
script :
function loadScript(sourceCode, callback){
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'application/javascript';
script.innerHTML = sourceCode;
script.onreadystatechange = callback;
script.onload = callback;
head.appendChild(script);
}
-
loadScript(sourceCode, function(){
var model = window.createModel();
console.log('model:' + model);
});
index.html <source type="module">, . . Chrome 63.0.3239.108.
= > I. <script type="module"> DOM?
= > II. eval script, import (, , )?
= > III. , ?
:
:
, , window.createTreeModel, . , . , ... , - , .