Determine original name of variable after its passed to a function
I've got a feeling this might not be possible, but I would like to determine the original variable name of a variable which has been passed to a function in javascript. I don't know how to explain it any better than that, so see if this example makes sense.
function getVariableName(unknownVariable){
return unknownVariable.originalName;
}
getVariableName(foo); //returns string "foo";
getVariableName(bar); //returns string "bar";
This is for a jquery plugin i'm working on, and i would like to be able to display the name of the variable which is passed to a "debug" function.
javascript
add a comment |
I've got a feeling this might not be possible, but I would like to determine the original variable name of a variable which has been passed to a function in javascript. I don't know how to explain it any better than that, so see if this example makes sense.
function getVariableName(unknownVariable){
return unknownVariable.originalName;
}
getVariableName(foo); //returns string "foo";
getVariableName(bar); //returns string "bar";
This is for a jquery plugin i'm working on, and i would like to be able to display the name of the variable which is passed to a "debug" function.
javascript
1
I am not sure what is the purpose of this, since you would need to get interested in variable values than the variable name.
– Sachin Shanbhag
Aug 4 '10 at 9:09
2
There are no variable names when a program is running. No "current" ones, and no "original" ones.
– Tomalak
Aug 4 '10 at 9:18
1
Haha, I figured this was a longshot, but worth a shot nonetheless. There isn't too much purpose, but if you want context you can see the current version of the plugin: andygroff.com/jquery-debugger-debugging-plugin If you view the object example, I would prefer that the title says "clothingCompany Properties" instead of simply "Object Properties" Its not terribly important, but would be nice.
– Andy Groff
Aug 4 '10 at 9:23
2
Somewhat related feature request: Suggestion to add nameof() to TypeScript compiler. If this ever lands you could donameof(foo) // returns the string "foo"
.
– styfle
Jan 3 '17 at 18:24
I've updated my answer below which gets you really close using ES6. Just add curly brackets.
– styfle
Aug 10 '18 at 18:23
add a comment |
I've got a feeling this might not be possible, but I would like to determine the original variable name of a variable which has been passed to a function in javascript. I don't know how to explain it any better than that, so see if this example makes sense.
function getVariableName(unknownVariable){
return unknownVariable.originalName;
}
getVariableName(foo); //returns string "foo";
getVariableName(bar); //returns string "bar";
This is for a jquery plugin i'm working on, and i would like to be able to display the name of the variable which is passed to a "debug" function.
javascript
I've got a feeling this might not be possible, but I would like to determine the original variable name of a variable which has been passed to a function in javascript. I don't know how to explain it any better than that, so see if this example makes sense.
function getVariableName(unknownVariable){
return unknownVariable.originalName;
}
getVariableName(foo); //returns string "foo";
getVariableName(bar); //returns string "bar";
This is for a jquery plugin i'm working on, and i would like to be able to display the name of the variable which is passed to a "debug" function.
javascript
javascript
asked Aug 4 '10 at 9:06
Andy GroffAndy Groff
2,1031423
2,1031423
1
I am not sure what is the purpose of this, since you would need to get interested in variable values than the variable name.
– Sachin Shanbhag
Aug 4 '10 at 9:09
2
There are no variable names when a program is running. No "current" ones, and no "original" ones.
– Tomalak
Aug 4 '10 at 9:18
1
Haha, I figured this was a longshot, but worth a shot nonetheless. There isn't too much purpose, but if you want context you can see the current version of the plugin: andygroff.com/jquery-debugger-debugging-plugin If you view the object example, I would prefer that the title says "clothingCompany Properties" instead of simply "Object Properties" Its not terribly important, but would be nice.
– Andy Groff
Aug 4 '10 at 9:23
2
Somewhat related feature request: Suggestion to add nameof() to TypeScript compiler. If this ever lands you could donameof(foo) // returns the string "foo"
.
– styfle
Jan 3 '17 at 18:24
I've updated my answer below which gets you really close using ES6. Just add curly brackets.
– styfle
Aug 10 '18 at 18:23
add a comment |
1
I am not sure what is the purpose of this, since you would need to get interested in variable values than the variable name.
– Sachin Shanbhag
Aug 4 '10 at 9:09
2
There are no variable names when a program is running. No "current" ones, and no "original" ones.
– Tomalak
Aug 4 '10 at 9:18
1
Haha, I figured this was a longshot, but worth a shot nonetheless. There isn't too much purpose, but if you want context you can see the current version of the plugin: andygroff.com/jquery-debugger-debugging-plugin If you view the object example, I would prefer that the title says "clothingCompany Properties" instead of simply "Object Properties" Its not terribly important, but would be nice.
– Andy Groff
Aug 4 '10 at 9:23
2
Somewhat related feature request: Suggestion to add nameof() to TypeScript compiler. If this ever lands you could donameof(foo) // returns the string "foo"
.
– styfle
Jan 3 '17 at 18:24
I've updated my answer below which gets you really close using ES6. Just add curly brackets.
– styfle
Aug 10 '18 at 18:23
1
1
I am not sure what is the purpose of this, since you would need to get interested in variable values than the variable name.
– Sachin Shanbhag
Aug 4 '10 at 9:09
I am not sure what is the purpose of this, since you would need to get interested in variable values than the variable name.
– Sachin Shanbhag
Aug 4 '10 at 9:09
2
2
There are no variable names when a program is running. No "current" ones, and no "original" ones.
– Tomalak
Aug 4 '10 at 9:18
There are no variable names when a program is running. No "current" ones, and no "original" ones.
– Tomalak
Aug 4 '10 at 9:18
1
1
Haha, I figured this was a longshot, but worth a shot nonetheless. There isn't too much purpose, but if you want context you can see the current version of the plugin: andygroff.com/jquery-debugger-debugging-plugin If you view the object example, I would prefer that the title says "clothingCompany Properties" instead of simply "Object Properties" Its not terribly important, but would be nice.
– Andy Groff
Aug 4 '10 at 9:23
Haha, I figured this was a longshot, but worth a shot nonetheless. There isn't too much purpose, but if you want context you can see the current version of the plugin: andygroff.com/jquery-debugger-debugging-plugin If you view the object example, I would prefer that the title says "clothingCompany Properties" instead of simply "Object Properties" Its not terribly important, but would be nice.
– Andy Groff
Aug 4 '10 at 9:23
2
2
Somewhat related feature request: Suggestion to add nameof() to TypeScript compiler. If this ever lands you could do
nameof(foo) // returns the string "foo"
.– styfle
Jan 3 '17 at 18:24
Somewhat related feature request: Suggestion to add nameof() to TypeScript compiler. If this ever lands you could do
nameof(foo) // returns the string "foo"
.– styfle
Jan 3 '17 at 18:24
I've updated my answer below which gets you really close using ES6. Just add curly brackets.
– styfle
Aug 10 '18 at 18:23
I've updated my answer below which gets you really close using ES6. Just add curly brackets.
– styfle
Aug 10 '18 at 18:23
add a comment |
6 Answers
6
active
oldest
votes
You're right, this is very much impossible in any sane way, since only the value gets passed into the function.
7
what's the insane way?
– johny why
Jan 14 '16 at 18:01
11
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
add a comment |
This is now somehow possible thanks to ES6:
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
The only (small) catch is that you have to wrap your unknown variable between {}
, which is no big deal.
2
{foo}
is just{foo:42}
... so you're just sending it as an object. SeeNew notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– Cody G.
Sep 28 '17 at 18:23
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
5
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
add a comment |
Well, all the global variables are properties of global object (this or window), aren't they?
So when I wanted to find out the name of my variables, I made following function:
var getName = function(variable) {
for (var prop in window) {
if (variable === window[prop]) {
return prop;
}
}
}
var helloWorld = "Hello World!";
console.log(getName(helloWorld)); // "helloWorld"
Sometimes doesn't work, for example, if 2 strings are created without new operator and have the same value.
Does this depend on being run in the browser? Or am I misunderstanding whatwindow
is?
– byxor
Jun 26 '17 at 16:26
1
This won't work if two objects have the same value.window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.
– styfle
Jun 26 '17 at 17:10
add a comment |
Global w/string method
Here is a technique that you can use to keep the name and the value of the variable.
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
This is effectively creating a dictionary that maps variable names to their value. This probably won't work for your existing code without refactoring every variable. But using this style, you can achieve a solution for this type of problem.
ES6 object method
In ES6/ES2015, you are able to initialize an object with name and value which can almost achieve what you are trying to do.
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
This works because you created a new object with key foo
and value the same as the variable foo, in this case hello
. Then our helper method gets the first key as a string.
Credit goes to this tweet.
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
@AndyGroff substituting theg
variable for thewindow
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.
– styfle
Oct 21 '13 at 17:09
add a comment |
Converting a set of unique variable into one JSON object for which I wrote this function
function makeJSON(){ //Pass the variable names as string parameters [not by reference]
ret={};
for(i=0; i<arguments.length; i++){
eval("ret."+arguments[i]+"="+arguments[i]);
}
return ret;
}
Example:
a=b=c=3;
console.log(makeJSON('a','b','c'));
Perhaps this is the reason for this query
5
ret[x] = x
; absolutely no reason foreval
here!
– deceze♦
Apr 29 '16 at 23:14
add a comment |
As you want debugging (show name of var and value of var),
I've been looking for it too, and just want to share my finding.
It is not by retrieving the name of the var from the var but the other way around : retrieve the value of the var from the name (as string) of the var.
It is possible to do it without eval, and with very simple code, at the condition you pass your var into the function with quotes around it, and you declare the variable globally :
foo = 'bar';
debug('foo');
function debug(Variable) {
var Value = this[Variable]; // in that occurrence, it is equivalent to
// this['foo'] which is the syntax to call the global variable foo
console.log(Variable + " is " + Value); // print "foo is bar"
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f3404057%2fdetermine-original-name-of-variable-after-its-passed-to-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
You're right, this is very much impossible in any sane way, since only the value gets passed into the function.
7
what's the insane way?
– johny why
Jan 14 '16 at 18:01
11
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
add a comment |
You're right, this is very much impossible in any sane way, since only the value gets passed into the function.
7
what's the insane way?
– johny why
Jan 14 '16 at 18:01
11
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
add a comment |
You're right, this is very much impossible in any sane way, since only the value gets passed into the function.
You're right, this is very much impossible in any sane way, since only the value gets passed into the function.
edited Jun 24 '15 at 11:16
Andrei V
5,50443452
5,50443452
answered Aug 4 '10 at 9:08
deceze♦deceze
400k64546703
400k64546703
7
what's the insane way?
– johny why
Jan 14 '16 at 18:01
11
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
add a comment |
7
what's the insane way?
– johny why
Jan 14 '16 at 18:01
11
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
7
7
what's the insane way?
– johny why
Jan 14 '16 at 18:01
what's the insane way?
– johny why
Jan 14 '16 at 18:01
11
11
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
Get a backtrace, get the file and line number of the function invocation, load the source code of that file, find and parse that line, try to figure out which variable was your parameter. Since there may be any number of function calls on one line and functions may be aliased at runtime, not to mention the complexity of the task, I hope the insanity of this is self evident.
– deceze♦
Jan 14 '16 at 19:32
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
This is now somewhat possible, see my answer.
– Offirmo
Sep 15 '17 at 1:29
add a comment |
This is now somehow possible thanks to ES6:
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
The only (small) catch is that you have to wrap your unknown variable between {}
, which is no big deal.
2
{foo}
is just{foo:42}
... so you're just sending it as an object. SeeNew notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– Cody G.
Sep 28 '17 at 18:23
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
5
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
add a comment |
This is now somehow possible thanks to ES6:
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
The only (small) catch is that you have to wrap your unknown variable between {}
, which is no big deal.
2
{foo}
is just{foo:42}
... so you're just sending it as an object. SeeNew notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– Cody G.
Sep 28 '17 at 18:23
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
5
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
add a comment |
This is now somehow possible thanks to ES6:
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
The only (small) catch is that you have to wrap your unknown variable between {}
, which is no big deal.
This is now somehow possible thanks to ES6:
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
The only (small) catch is that you have to wrap your unknown variable between {}
, which is no big deal.
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
function getVariableName(unknownVariableInAHash){
return Object.keys(unknownVariableInAHash)[0]
}
const foo = 42
const bar = 'baz'
console.log(getVariableName({foo})) //returns string "foo"
console.log(getVariableName({bar})) //returns string "bar"
answered Sep 15 '17 at 1:28
OffirmoOffirmo
10.5k55182
10.5k55182
2
{foo}
is just{foo:42}
... so you're just sending it as an object. SeeNew notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– Cody G.
Sep 28 '17 at 18:23
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
5
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
add a comment |
2
{foo}
is just{foo:42}
... so you're just sending it as an object. SeeNew notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
– Cody G.
Sep 28 '17 at 18:23
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
5
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
2
2
{foo}
is just {foo:42}
... so you're just sending it as an object. See New notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…– Cody G.
Sep 28 '17 at 18:23
{foo}
is just {foo:42}
... so you're just sending it as an object. See New notations in ECMAScript 2015
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…– Cody G.
Sep 28 '17 at 18:23
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
@CodyG. I'm perfectly aware of that.
– Offirmo
Sep 28 '17 at 22:17
5
5
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
Then you shouldn't say "somehow possible thanks to es6", your answer is basically --- 'you can do this by sending the value as an object with the key as the variable name'... which is also easily done in es5 with a polyfill of Object.keys, or simply by passing an object with the variable name as another property.
– Cody G.
Sep 28 '17 at 22:42
add a comment |
Well, all the global variables are properties of global object (this or window), aren't they?
So when I wanted to find out the name of my variables, I made following function:
var getName = function(variable) {
for (var prop in window) {
if (variable === window[prop]) {
return prop;
}
}
}
var helloWorld = "Hello World!";
console.log(getName(helloWorld)); // "helloWorld"
Sometimes doesn't work, for example, if 2 strings are created without new operator and have the same value.
Does this depend on being run in the browser? Or am I misunderstanding whatwindow
is?
– byxor
Jun 26 '17 at 16:26
1
This won't work if two objects have the same value.window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.
– styfle
Jun 26 '17 at 17:10
add a comment |
Well, all the global variables are properties of global object (this or window), aren't they?
So when I wanted to find out the name of my variables, I made following function:
var getName = function(variable) {
for (var prop in window) {
if (variable === window[prop]) {
return prop;
}
}
}
var helloWorld = "Hello World!";
console.log(getName(helloWorld)); // "helloWorld"
Sometimes doesn't work, for example, if 2 strings are created without new operator and have the same value.
Does this depend on being run in the browser? Or am I misunderstanding whatwindow
is?
– byxor
Jun 26 '17 at 16:26
1
This won't work if two objects have the same value.window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.
– styfle
Jun 26 '17 at 17:10
add a comment |
Well, all the global variables are properties of global object (this or window), aren't they?
So when I wanted to find out the name of my variables, I made following function:
var getName = function(variable) {
for (var prop in window) {
if (variable === window[prop]) {
return prop;
}
}
}
var helloWorld = "Hello World!";
console.log(getName(helloWorld)); // "helloWorld"
Sometimes doesn't work, for example, if 2 strings are created without new operator and have the same value.
Well, all the global variables are properties of global object (this or window), aren't they?
So when I wanted to find out the name of my variables, I made following function:
var getName = function(variable) {
for (var prop in window) {
if (variable === window[prop]) {
return prop;
}
}
}
var helloWorld = "Hello World!";
console.log(getName(helloWorld)); // "helloWorld"
Sometimes doesn't work, for example, if 2 strings are created without new operator and have the same value.
edited Jul 18 '15 at 12:57
answered Jun 7 '14 at 19:37
RunninglVlanRunninglVlan
11118
11118
Does this depend on being run in the browser? Or am I misunderstanding whatwindow
is?
– byxor
Jun 26 '17 at 16:26
1
This won't work if two objects have the same value.window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.
– styfle
Jun 26 '17 at 17:10
add a comment |
Does this depend on being run in the browser? Or am I misunderstanding whatwindow
is?
– byxor
Jun 26 '17 at 16:26
1
This won't work if two objects have the same value.window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.
– styfle
Jun 26 '17 at 17:10
Does this depend on being run in the browser? Or am I misunderstanding what
window
is?– byxor
Jun 26 '17 at 16:26
Does this depend on being run in the browser? Or am I misunderstanding what
window
is?– byxor
Jun 26 '17 at 16:26
1
1
This won't work if two objects have the same value.
window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.– styfle
Jun 26 '17 at 17:10
This won't work if two objects have the same value.
window.a=1;window.b=1;
It will return the name of the first matching value. Additionally, it is bad practice to define variables in the global scope.– styfle
Jun 26 '17 at 17:10
add a comment |
Global w/string method
Here is a technique that you can use to keep the name and the value of the variable.
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
This is effectively creating a dictionary that maps variable names to their value. This probably won't work for your existing code without refactoring every variable. But using this style, you can achieve a solution for this type of problem.
ES6 object method
In ES6/ES2015, you are able to initialize an object with name and value which can almost achieve what you are trying to do.
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
This works because you created a new object with key foo
and value the same as the variable foo, in this case hello
. Then our helper method gets the first key as a string.
Credit goes to this tweet.
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
@AndyGroff substituting theg
variable for thewindow
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.
– styfle
Oct 21 '13 at 17:09
add a comment |
Global w/string method
Here is a technique that you can use to keep the name and the value of the variable.
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
This is effectively creating a dictionary that maps variable names to their value. This probably won't work for your existing code without refactoring every variable. But using this style, you can achieve a solution for this type of problem.
ES6 object method
In ES6/ES2015, you are able to initialize an object with name and value which can almost achieve what you are trying to do.
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
This works because you created a new object with key foo
and value the same as the variable foo, in this case hello
. Then our helper method gets the first key as a string.
Credit goes to this tweet.
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
@AndyGroff substituting theg
variable for thewindow
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.
– styfle
Oct 21 '13 at 17:09
add a comment |
Global w/string method
Here is a technique that you can use to keep the name and the value of the variable.
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
This is effectively creating a dictionary that maps variable names to their value. This probably won't work for your existing code without refactoring every variable. But using this style, you can achieve a solution for this type of problem.
ES6 object method
In ES6/ES2015, you are able to initialize an object with name and value which can almost achieve what you are trying to do.
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
This works because you created a new object with key foo
and value the same as the variable foo, in this case hello
. Then our helper method gets the first key as a string.
Credit goes to this tweet.
Global w/string method
Here is a technique that you can use to keep the name and the value of the variable.
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
This is effectively creating a dictionary that maps variable names to their value. This probably won't work for your existing code without refactoring every variable. But using this style, you can achieve a solution for this type of problem.
ES6 object method
In ES6/ES2015, you are able to initialize an object with name and value which can almost achieve what you are trying to do.
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
This works because you created a new object with key foo
and value the same as the variable foo, in this case hello
. Then our helper method gets the first key as a string.
Credit goes to this tweet.
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
// Set up a global variable called g
var g = {};
// All other variables should be defined as properties of this global object
g.foo = 'hello';
g.bar = 'world';
// Setup function
function doStuff(str) {
if (str in g) {
var name = str;
var value = g[str];
// Do stuff with the variable name and the variable value here
// For this example, simply print to console
console.log(name, value);
} else {
console.error('Oh snap! That variable does not exist!');
}
}
// Call the function
doStuff('foo'); // log: foo hello
doStuff('bar'); // log: bar world
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist!
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
function getVariableName(unknownVariable) {
return Object.keys(unknownVariable)[0];
}
var foo = 'hello';
var output = getVariableName({ foo }); // Note the curly brackets
console.log(output);
edited Aug 10 '18 at 17:57
answered Oct 12 '13 at 1:12
styflestyfle
6,978155294
6,978155294
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
@AndyGroff substituting theg
variable for thewindow
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.
– styfle
Oct 21 '13 at 17:09
add a comment |
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
@AndyGroff substituting theg
variable for thewindow
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.
– styfle
Oct 21 '13 at 17:09
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
Thanks for the answer. This is a nice solution, although it really doesn't solve the problem I had. I was writing a debugging plugin which was going to create a modal alert with information on variables, including its name. It would need to run with any javascript, so storing all variables as object properties isn't a viable solution. Thanks!
– Andy Groff
Oct 20 '13 at 11:15
@AndyGroff substituting the
g
variable for the window
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.– styfle
Oct 21 '13 at 17:09
@AndyGroff substituting the
g
variable for the window
variable might solve your problem. But ultimately you will have to access the variables by string instead of the identifier.– styfle
Oct 21 '13 at 17:09
add a comment |
Converting a set of unique variable into one JSON object for which I wrote this function
function makeJSON(){ //Pass the variable names as string parameters [not by reference]
ret={};
for(i=0; i<arguments.length; i++){
eval("ret."+arguments[i]+"="+arguments[i]);
}
return ret;
}
Example:
a=b=c=3;
console.log(makeJSON('a','b','c'));
Perhaps this is the reason for this query
5
ret[x] = x
; absolutely no reason foreval
here!
– deceze♦
Apr 29 '16 at 23:14
add a comment |
Converting a set of unique variable into one JSON object for which I wrote this function
function makeJSON(){ //Pass the variable names as string parameters [not by reference]
ret={};
for(i=0; i<arguments.length; i++){
eval("ret."+arguments[i]+"="+arguments[i]);
}
return ret;
}
Example:
a=b=c=3;
console.log(makeJSON('a','b','c'));
Perhaps this is the reason for this query
5
ret[x] = x
; absolutely no reason foreval
here!
– deceze♦
Apr 29 '16 at 23:14
add a comment |
Converting a set of unique variable into one JSON object for which I wrote this function
function makeJSON(){ //Pass the variable names as string parameters [not by reference]
ret={};
for(i=0; i<arguments.length; i++){
eval("ret."+arguments[i]+"="+arguments[i]);
}
return ret;
}
Example:
a=b=c=3;
console.log(makeJSON('a','b','c'));
Perhaps this is the reason for this query
Converting a set of unique variable into one JSON object for which I wrote this function
function makeJSON(){ //Pass the variable names as string parameters [not by reference]
ret={};
for(i=0; i<arguments.length; i++){
eval("ret."+arguments[i]+"="+arguments[i]);
}
return ret;
}
Example:
a=b=c=3;
console.log(makeJSON('a','b','c'));
Perhaps this is the reason for this query
edited Dec 22 '15 at 14:08
answered Dec 17 '15 at 2:52
JudeJude
294
294
5
ret[x] = x
; absolutely no reason foreval
here!
– deceze♦
Apr 29 '16 at 23:14
add a comment |
5
ret[x] = x
; absolutely no reason foreval
here!
– deceze♦
Apr 29 '16 at 23:14
5
5
ret[x] = x
; absolutely no reason for eval
here!– deceze♦
Apr 29 '16 at 23:14
ret[x] = x
; absolutely no reason for eval
here!– deceze♦
Apr 29 '16 at 23:14
add a comment |
As you want debugging (show name of var and value of var),
I've been looking for it too, and just want to share my finding.
It is not by retrieving the name of the var from the var but the other way around : retrieve the value of the var from the name (as string) of the var.
It is possible to do it without eval, and with very simple code, at the condition you pass your var into the function with quotes around it, and you declare the variable globally :
foo = 'bar';
debug('foo');
function debug(Variable) {
var Value = this[Variable]; // in that occurrence, it is equivalent to
// this['foo'] which is the syntax to call the global variable foo
console.log(Variable + " is " + Value); // print "foo is bar"
}
add a comment |
As you want debugging (show name of var and value of var),
I've been looking for it too, and just want to share my finding.
It is not by retrieving the name of the var from the var but the other way around : retrieve the value of the var from the name (as string) of the var.
It is possible to do it without eval, and with very simple code, at the condition you pass your var into the function with quotes around it, and you declare the variable globally :
foo = 'bar';
debug('foo');
function debug(Variable) {
var Value = this[Variable]; // in that occurrence, it is equivalent to
// this['foo'] which is the syntax to call the global variable foo
console.log(Variable + " is " + Value); // print "foo is bar"
}
add a comment |
As you want debugging (show name of var and value of var),
I've been looking for it too, and just want to share my finding.
It is not by retrieving the name of the var from the var but the other way around : retrieve the value of the var from the name (as string) of the var.
It is possible to do it without eval, and with very simple code, at the condition you pass your var into the function with quotes around it, and you declare the variable globally :
foo = 'bar';
debug('foo');
function debug(Variable) {
var Value = this[Variable]; // in that occurrence, it is equivalent to
// this['foo'] which is the syntax to call the global variable foo
console.log(Variable + " is " + Value); // print "foo is bar"
}
As you want debugging (show name of var and value of var),
I've been looking for it too, and just want to share my finding.
It is not by retrieving the name of the var from the var but the other way around : retrieve the value of the var from the name (as string) of the var.
It is possible to do it without eval, and with very simple code, at the condition you pass your var into the function with quotes around it, and you declare the variable globally :
foo = 'bar';
debug('foo');
function debug(Variable) {
var Value = this[Variable]; // in that occurrence, it is equivalent to
// this['foo'] which is the syntax to call the global variable foo
console.log(Variable + " is " + Value); // print "foo is bar"
}
edited Jan 3 at 1:04
answered Dec 31 '18 at 17:01
HelworHelwor
12
12
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f3404057%2fdetermine-original-name-of-variable-after-its-passed-to-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
I am not sure what is the purpose of this, since you would need to get interested in variable values than the variable name.
– Sachin Shanbhag
Aug 4 '10 at 9:09
2
There are no variable names when a program is running. No "current" ones, and no "original" ones.
– Tomalak
Aug 4 '10 at 9:18
1
Haha, I figured this was a longshot, but worth a shot nonetheless. There isn't too much purpose, but if you want context you can see the current version of the plugin: andygroff.com/jquery-debugger-debugging-plugin If you view the object example, I would prefer that the title says "clothingCompany Properties" instead of simply "Object Properties" Its not terribly important, but would be nice.
– Andy Groff
Aug 4 '10 at 9:23
2
Somewhat related feature request: Suggestion to add nameof() to TypeScript compiler. If this ever lands you could do
nameof(foo) // returns the string "foo"
.– styfle
Jan 3 '17 at 18:24
I've updated my answer below which gets you really close using ES6. Just add curly brackets.
– styfle
Aug 10 '18 at 18:23