Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 相当于Python';s locals()?_Javascript - Fatal编程技术网

Javascript 相当于Python';s locals()?

Javascript 相当于Python';s locals()?,javascript,Javascript,Python的locals()函数在函数范围内调用时,返回一个字典,其键值对是函数的局部变量的名称和值。例如: def menu(): spam = 3 ham = 9 eggs = 5 return locals() print menu() # {'eggs': 5, 'ham': 9, 'spam': 3} JavaScript有类似的功能吗?没有,JavaScript函数中没有类似的功能,但是有一种方法可以实现非常类似的功能,即使用this定义对象

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

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

    return locals()

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

JavaScript有类似的功能吗?

没有,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}

作用域
本身在JavaScript中是不可访问的,因此没有等价物。但是,如果绝对需要这种特性,您可以始终声明一个充当局部作用域的私有变量

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

    return locals;
}

此外,如果您想使用类似于
locals()
的方法来检查变量,那么您还有其他解决方案,例如使用浏览器的开发工具设置断点和添加手表。放入
调试器直接在某些浏览器中也可以使用。

JavaScript没有这个功能。没有这样的JavaScript功能。但是,您可以放置一个
调试器语句并检查devtools.-1中的作用域以供使用。它不是你所期望的。@Bergi它正是我想要的。每次调用
菜单
时,它都会创建一个新对象。该对象的作用是成为OP想要的字典。@Paulpro:它比你想要的要多。它创建一个匿名函数表达式的实例(带有自定义原型),这是垃圾。使用一个简单的对象文字来代替:
function menu(){var o={spam:3,ham:9,eggs:5};console.log(o);return o;}
@Bergi我看不出这有什么问题,除非OP的意图是使用
menu
作为构造函数,这与他们的问题不同。返回的对象包含不必要的垃圾,即
.constructor
属性(尝试
console.log(新建(menu().constructor));
)。如果出于某种原因想使用
,请在IEFE上使用
。调用