-
-
Save isaacs/10168967 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var codes = | |
[ 'function funny(p) {\n' + | |
' return [p, s];\n' + | |
'}\n', | |
'var funny = function (p) {\n' + | |
' return [p, s];\n' + | |
'}\n', | |
'var funny = function wry(p) {\n' + | |
' return [p, s];\n' + | |
'}\n', | |
'var funny = new Function("p", "return [p, s];")\n' | |
] | |
var template = | |
'var s = "GLOBAL";\n' + | |
';(function() {\n' + | |
'var s = "LOCAL";\n' + | |
'console.log("BEFORE")\n' + | |
'console.log("typeof funny = %s", typeof funny)\n' + | |
'try {\n' + | |
' console.log("funny.name = %j", funny.name)\n' + | |
'} catch (er) {\n' + | |
' console.log("failed reading name")\n' + | |
'}\n' + | |
'try {\n' + | |
' var res = funny("b")\n' + | |
' console.log("result: %j", res)\n' + | |
'} catch (er) {\n' + | |
' console.log("not runnable")\n' + | |
'}\n' + | |
'{{CODE_RAW}}\n' + | |
'console.log("AFTER")\n' + | |
'console.log("typeof funny = %s", typeof funny)\n' + | |
'try {\n' + | |
' console.log("funny.name = %j", funny.name)\n' + | |
'} catch (er) {\n' + | |
' console.log("failed reading name")\n' + | |
'}\n' + | |
'try {\n' + | |
' var res = funny("a")\n' + | |
' console.log("result: %j", res)\n' + | |
'} catch (er) {\n' + | |
' console.log("not runnable")\n' + | |
'}\n' + | |
'})()\n' | |
var vm = require('vm') | |
codes.forEach(function(code) { | |
console.log("-------\ncode=%j", code) | |
var program = template | |
.replace(/\{\{CODE_RAW\}\}/g, code) | |
vm.runInNewContext(program, { console: console }) | |
}) | |
console.log("-------") | |
// $ node functions.js | |
// ------- | |
// code="function funny(p) {\n return [p, s];\n}\n" | |
// BEFORE | |
// typeof funny = function | |
// funny.name = "funny" | |
// result: ["b","LOCAL"] | |
// AFTER | |
// typeof funny = function | |
// funny.name = "funny" | |
// result: ["a","LOCAL"] | |
// ------- | |
// code="var funny = function (p) {\n return [p, s];\n}\n" | |
// BEFORE | |
// typeof funny = undefined | |
// failed reading name | |
// not runnable | |
// AFTER | |
// typeof funny = function | |
// funny.name = "" | |
// result: ["a","LOCAL"] | |
// ------- | |
// code="var funny = function wry(p) {\n return [p, s];\n}\n" | |
// BEFORE | |
// typeof funny = undefined | |
// failed reading name | |
// not runnable | |
// AFTER | |
// typeof funny = function | |
// funny.name = "wry" | |
// result: ["a","LOCAL"] | |
// ------- | |
// code="var funny = new Function(\"p\", \"return [p, s];\")\n" | |
// BEFORE | |
// typeof funny = undefined | |
// failed reading name | |
// not runnable | |
// AFTER | |
// typeof funny = function | |
// funny.name = "" | |
// result: ["a","GLOBAL"] | |
// ------- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment