如何在JavaScript函数钩子中访问全局变量?

10

我想在下面的钩子函数中使用全局变量 'x'。

var x = 10; //global variable

var oldA = a;    

a = function a(param){

    alert(x);        //showing error: x is undefined 

    return oldA(param);

}

如何解决错误?


你也应该看看作用域和提升 - Praveen
@user1671639:分配给 a 的函数在这里 _无法被提升_,因为它是一个表达式。唯一会被提升的是变量声明。 - Elias Van Ootegem
你在 node 环境中吗?如果是的话,尝试 global.x = 10;alert(global.x)。实际上,污染全局对象并不是一个好主意。但是,你可能想尝试一下。 - user405398
2个回答

13

您的代码对我来说运行良好,但是您可能希望通过使用 window.x 显式地将 x 解析为全局变量。
当不在浏览器环境中或者全局对象不叫做 window 的环境中时,请尝试:

(window || root || global || GLOBAL || this || self || {x: undefined}).x

{x:undefined}对象文字仅是为了确保表达式不会出错。
我列出了我所知道的几乎所有名称,这些名称都是给予(严格来说是无名的)全局对象的,只需使用适用于您情况的名称。

另一方面,如果全局变量x在函数a被调用时可能被重新赋值,那么闭包将更可取:

a = (function (globalX)
{
    return function a(param)
    {
        console.log(globalX);
        return oldA(param);
    };
}(x || window.x));//pass reference to x, or window.x if x is undefined to the scope

当然,如果你处于严格模式,你也需要小心隐含的全局变量。
这就是我能想到的代码出了问题的原因,可能提供更多细节可以给我们提供实际发生情况的线索...


@user1671639:谢谢。我不会称你的评论为“错误”,因为变量声明毕竟是被提升的。在OP的代码片段中,oldA将是undefined,而oldA(param)无论如何都会抛出一个错误。向OP提供关于提升的链接是一个很好的贡献。 - Elias Van Ootegem
@EliasVanOotegem 在Mozilla Firefox控制台中,(root || window)会抛出错误。 ReferenceError: root未定义 - Mohammed Shareef C
@Mohammed,当然,root 在 NodeJS 中是全局对象的别名。在浏览器中,只需使用 window - Elias Van Ootegem

0

要在函数内访问全局 Js 变量,不要在函数作用域中使用 var,并在全局作用域中声明 var。

<script>
    var foo = "hello";
    function fxn() {
        alert(foo);
        foo = "bai";
    }
    fxn();

    alert(foo+"out side");
</script>

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