2011-03-22 62 views
10

我想创建一个快速函数,将console.log一个变量的名称和值。我想要在控制台中显示该功能的结果:foo: barJavascript:从变量本身引用一个变量名称

我对功能的基本思路是这样的:

function varlog(var_name) 
{ 
    console.log(var_name + ": " + eval(var_name)); 
} 

,我会打电话的正是如此:

function someRandomFunction() 
{ 
    var foo = "bar"; 
    // ... some stuff happens 
    varlog("foo"); 
} 

这个工作,如果foo是全球性的,但在不工作提供的例子。另一种也只能在全球范围内使用的选项是使用window[var_name]而不是可怕的eval

我不认为我问的是可能的,但我想我会把它扔到那里。

我花了很多时间试图懒惰。我目前的方法只是console.log('foo: ' + bar);,它工作得很好。但现在我只想知道这是否可能。

一些其他的问题,我在寻找这个参考点/创造什么我现在有:

-

编辑:如果名称“foo”可以从变量派生,我很乐意致电varlog(foo)

+2

这个问题也:http://stackoverflow.com/questions/1009911/javascript-get-argument-value-and-name-of-passed-variable – manji 2011-03-22 17:36:59

+0

@najmeddine我已经差不多复制更好的格式。卫生署!谢谢:) – hookedonwinter 2011-03-22 17:42:10

+0

我可能只是扩展JavaScript来转换所有var赋值'var foo =“bar”;''var foo = {foo:“bar”};'(主要是开玩笑的)(主要是) – hookedonwinter 2011-03-22 17:54:45

回答

4

它不起作用的原因是因为变量foo无法访问功能varlogfoo在someRandomFunction中声明,并且永远不会传递到varlog,因此varlog不知道变量foo是什么!您可以通过将变量foo传入函数(或使用某种闭包使foovarlog范围内)以及其字符串表示形式来解决此问题,否则,我认为您运气不好。

希望这会有所帮助。

+0

这就是我'假设,只是想知道是否有人有一些荒谬的方法。因为调用varlog(“foo”,foo);'可以工作,但并不能真正节省很多时间在'console.log('foo:'+ foo);' – hookedonwinter 2011-03-22 17:34:52

+0

好吧,我认为你无法做到这一点。你只是在寻找一些语法糖? – idbentley 2011-03-22 17:42:20

+0

只是懒惰。它是'varlog(foo);'和'console.log('foo:'+ foo);'的不同之处。 – hookedonwinter 2011-03-22 17:43:33

2

我不相信你想要做什么是可能的。

我能想到的最好的办法是通过一个对象varlog基本上是一个键值哈希:

function varlog(obj) 
{ 
    for (var varname in obj) { 
     console.log(varname + ": " + obj[varname]); 
    } 
} 


function someRandomFunction() 
{ 
    var foo = "bar"; 
    // ... some stuff happens 
    varlog({foo: foo}); 
} 
+0

这是完全有效的,认为没有一次传递变量名的时间节省的好处。类似于调用'varlog(“foo”,foo);'。但是,它确实有效! :) – hookedonwinter 2011-03-22 17:50:50

3

虽然我不知道这种可能性,我想分享一个小主意:

Object.prototype.log = function(with_message) { 
    console.log(with_message + ":" + this); 
} 

var x = "string"; 
x.log("x"); 

就像我说的一个小想法。

0

我喜欢@mhitza的想法,所以我让它更大一点...

缺点是需要使用.value来达到可变内容。

Object.prototype.log = function(message) { 
 
    if (message) console.log(this.name, this.value, message); 
 
    else console.log(this.name, this.value); 
 
} 
 

 
function nar (name, value) { 
 
    var o = {name: name, value: value}; 
 
    this[name] = o; 
 
    return o; 
 
} 
 

 
// var globalVar = 1; 
 
nar('globalVar', 1); 
 

 
globalVar.log(); 
 
// > globalVar 1 
 

 
globalVar.value += 5; 
 

 
globalVar.log('equal six'); 
 
// > globalVar 6 equal six 
 

 
var someFunction = function() { 
 
    // var localVar = 2; 
 
    nar('localVar', 2); 
 

 
    localVar.log('someInfo'); 
 
    // > localVar 2 someInfo 
 
}; 
 

 
someFunction();

2

解决方案 - (您的实际使用情况) - console.log({foo})

ES6IdentifierReference s的被接受为PropertyDefinition S于该ObjectLiteralPropertyDefinitionListsee compatibility chart ):

可变名称被设定为ObjectPropertykey
和可变被设定为ObjectPropertyvalue

由于console.log显示了他们的Propertiy/IES' key小号Object S和value是你可以使用通过调用console.log({foo})同时看到你的变量的

注意,当你初始化一个匿名object几个 变量,因为我在第二console.log做,而他们出现在 相同的顺序在这里的代码片段的输出初始化,它们可能 得到重新排序(按字母顺序)在别处。

var testint = 3 
 
var teststring = "hi" 
 
var testarr = ["one", 2, (function three(){})] 
 
var testobj = {4:"four", 5:"five", nested:{6:"six",7:"seven"}} 
 
console.log({testint}) 
 
console.log({testint, teststring, testarr, testobj})

答案 - (到问题的标题) - Object.keys({foo})[0]

您也可以使用这个速记Object Initializer连同Object.keys()以笔直访问变量名:

var name = "value" 
 
console.log(Object.keys({name})[0])