web-dev-qa-db-ja.com

javascriptの関数フックでグローバル変数にアクセスする方法は?

以下のフック関数でグローバル変数「x」を使用したいと思います。

var x = 10; //global variable

var oldA = a;    

a = function a(param){

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

    return oldA(param);

}

エラーを解決する方法は?

8
Mmh

あなたのコードは私にとっては問題なく動作しますが、window.xを使用して、xをグローバル変数に明示的に解決したい場合があります。
ブラウザ環境、またはグローバルオブジェクトがwindowと呼ばれない環境にない場合は、次のことを試してください。

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

{x:undefined}オブジェクトリテラルは、式がエラーをスローしないようにするためのものです。
(厳密に言えば名前のない)グローバルオブジェクトに付けられている、私が知っているほとんどすべての名前をリストしました。あなたのケースに当てはまる可能性のある名前を使用してください。

一方、グローバル変数xmightが関数(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

もちろん、厳密モードの場合は、暗黙のグローバルにも注意する必要があります。
それがあなたのコードでうまくいかないと私が考えることができるすべてです、いくつかのより多くの詳細は私たちに実際に起こっていることの手がかりを提供するかもしれません...

10

関数内のグローバルJs変数にアクセスするには、関数スコープでVarを使用せず、グローバルスコープでvarについて言及します。例えば。

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

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