Python的locals()
函数,当在函数范围内调用时返回一个字典,其中键值对是函数本地变量的名称和值。例如:
def menu():
spam = 3
ham = 9
eggs = 5
return locals()
print menu() # {'eggs': 5, 'ham': 9, 'spam': 3}
JavaScript有类似的东西吗?
Python的locals()
函数,当在函数范围内调用时返回一个字典,其中键值对是函数本地变量的名称和值。例如:
def menu():
spam = 3
ham = 9
eggs = 5
return locals()
print menu() # {'eggs': 5, 'ham': 9, 'spam': 3}
scope
本身在JavaScript中不可访问,因此没有相应的功能。但是,如果您绝对需要这种功能,您可以始终声明一个作为本地范围的私有变量。
function a() {
var locals = {
b: 1,
c: 2
};
return locals;
}
此外,如果您想使用locals()
的原因是为了检查变量,则有其他解决方案,例如使用浏览器开发工具中的断点和添加监视。在代码中直接放置debugger;
也可以在某些浏览器中起作用。
不,JavaScript函数中没有类似的东西,但是可以使用 this
来定义对象上的所有属性,而不是作为局部变量来实现非常相似的功能:
function menu(){
return function(){
this.spam = 3;
this.ham = 9;
this.eggs = 5;
// Do other stuff, you can reference `this` anywhere.
console.log(this); // Object {'eggs': 5, 'ham': 9, 'spam': 3}
return this; // this is your replacement for locals()
}.call({});
}
console.log(menu()); // Object {'eggs': 5, 'ham': 9, 'spam': 3}
menu
时,它都会创建一个新的对象。该对象的目的是成为 OP 所需的字典。 - Paulconstructor
属性的存在有什么问题。这不像是一个内存泄漏。但你说得对,那确实是一种更好的方式,我之前没有想到过。谢谢。 - PaulObject
的构造函数属性,console.log(new({}).constructor);
,但我同意这是对new
运算符的误用,因为你忽略了它大部分的效果,比如设置原型链。问题更多的是,这是一个过于复杂的解决方案,甚至比使用简单的对象字面量还要不灵活。即使是menu.call({});
也太多余了。 - plalxmenu
作用域进行垃圾回收。这是无意的 - 一种泄漏。当然,除非构造了大量的menu()
对象(并且没有立即销毁),并且该作用域包含大量值,否则不会注意到它。尽管如此,这种模式仍应被视为一种不良实践。 - Bergi