Skip to content

Instantly share code, notes, and snippets.

@isaacs
Forked from hillarymelville/gist:10000687
Last active March 29, 2024 17:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save isaacs/10168967 to your computer and use it in GitHub Desktop.
Save isaacs/10168967 to your computer and use it in GitHub Desktop.
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