Python的locals()相当于什么?

5

Python的locals()函数,当在函数范围内调用时返回一个字典,其中键值对是函数本地变量的名称和值。例如:

def menu():
    spam = 3
    ham = 9
    eggs = 5

    return locals()

print menu()  # {'eggs': 5, 'ham': 9, 'spam': 3}

JavaScript有类似的东西吗?

4
JavaScript 没有这个。 - elclanrs
1
没有这样的JavaScript函数。但是,您可以放置一个“debugger;”语句并在开发工具中检查作用域。 - Bergi
2个回答

4

scope本身在JavaScript中不可访问,因此没有相应的功能。但是,如果您绝对需要这种功能,您可以始终声明一个作为本地范围的私有变量。

function a() {
    var locals = {
        b: 1,
        c: 2
    };

    return locals;
}

此外,如果您想使用locals()的原因是为了检查变量,则有其他解决方案,例如使用浏览器开发工具中的断点和添加监视。在代码中直接放置debugger;也可以在某些浏览器中起作用。


2

不,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}

1
不要使用new function(){…}。它的行为与你期望的不同。 - Bergi
1
@Bergi 它完全符合我的要求。每次调用 menu 时,它都会创建一个新的对象。该对象的目的是成为 OP 所需的字典。 - Paul
1
@Bergi,我真的不认为constructor属性的存在有什么问题。这不像是一个内存泄漏。但你说得对,那确实是一种更好的方式,我之前没有想到过。谢谢。 - Paul
1
@Bergi,那不是一个很好的论点,因为对象字面量也有一个指向Object的构造函数属性,console.log(new({}).constructor);,但我同意这是对new运算符的误用,因为你忽略了它大部分的效果,比如设置原型链。问题更多的是,这是一个过于复杂的解决方案,甚至比使用简单的对象字面量还要不灵活。即使是menu.call({});也太多余了。 - plalx
1
@plalx:由于构造函数存在于对象上,因此在对象之前无法对menu作用域进行垃圾回收。这是无意的 - 一种泄漏。当然,除非构造了大量的menu()对象(并且没有立即销毁),并且该作用域包含大量值,否则不会注意到它。尽管如此,这种模式仍应被视为一种不良实践。 - Bergi
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接