Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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变量添加到本地范围_Javascript_Scope - Fatal编程技术网

将JavaScript变量添加到本地范围

将JavaScript变量添加到本地范围,javascript,scope,Javascript,Scope,我有一组变量,我想把它们作为一个函数的输入,然后定义它们以便在该函数中使用 例如: var variables = { foo: 1, bar: 2, }; function doSomething (scope) { makeLocal(scope); // I'd like something to do this return foo + bar; } doSomething(variables); // should return 3 这样的事情存

我有一组变量,我想把它们作为一个函数的输入,然后定义它们以便在该函数中使用

例如:

var variables = {
    foo: 1,
    bar: 2,
};

function doSomething (scope) {
    makeLocal(scope); // I'd like something to do this

    return foo + bar;
}

doSomething(variables); // should return 3

这样的事情存在吗?PHP有一个功能来实现这一点,我希望JavaScript也有类似的功能。我知道我可以向
窗口添加属性,但如果可能的话,我不想污染我的全局名称空间。

有一个很好的javascript库,允许您使用php函数,就像

看一看

以下是您要查找的内容:


JavaScript与PHP的摘录没有任何等价之处。一种接近的方法是在调用
makeLocal()
时绑定当前上下文,并为其分配变量:


这样做的缺点是如果
doSomething()
没有上下文,它将是全局对象(浏览器中的窗口),并且您的变量会污染全局范围。

scope.foo+scope.bar
有什么问题?@entropic我计划有很多变量,并大量使用它们。如果我能帮上忙的话,我宁愿不要到处都有“scope”(甚至是一个单字符的变量名)。在JS中,这不是一个本地的方法。如果可以使用一些难看的
eval()
技巧来实现这一点,则必须在
doSomething()
中实现,否则新变量将在
makeLocal()
的范围内。我可能说得太快了,这在
窗口
之外的任何上下文中都不起作用。您能否提供一个在另一个上下文中工作的示例?只有当
This
是全局上下文时(大多数时间
window
除外,例如在严格模式下),此示例才有效。当
doSomething.call({},scope)
obj.doSomething(scope)
对此问题时,将不起作用;您需要使用
返回this.foo+this.bar。但是当它工作时,它当然会污染全局名称空间。是的,我同意-它不在全局范围之外工作。让它在任何范围内工作的唯一方法是让它存储
window[key]=scope[key]
,而不是
this
,但这总是使用globals。我认为在JavaScript中没有其他方法可以做到这一点。
var variables = {
    foo: 1,
    bar: 2,
};

function makeLocal(scope){
    for(var key in scope){
        this[key] = scope[key];   
    }
}

function doSomething (scope) {
    makeLocal.call(this, scope);

    return foo + bar;
}