Как получить доступ к глобальной переменной в хуке функции в javascript?

Я хочу использовать глобальную переменную «x» в приведенной ниже функции хука.

var x = 10; //global variable

var oldA = a;    

a = function a(param){

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

    return oldA(param);

}

Как устранить ошибку?


person Mmh    schedule 28.06.2013    source источник
comment
также вам следует изучить обзор и подъем   -  person Praveen    schedule 28.06.2013
comment
@ user1671639: функция, назначенная a, не может быть поднята здесь, так как это выражение. Единственное, что здесь поднимается, — это объявления переменных.   -  person Elias Van Ootegem    schedule 28.06.2013
comment
Вы находитесь в node среде? В этом случае попробуйте global.x = 10; и alert(global.x). На самом деле, загрязнять глобальный объект — плохая идея. Но, возможно, вы захотите попробовать.   -  person    schedule 28.06.2013


Ответы (2)


Ваш код отлично работает для меня, но вы можете явно преобразовать x в глобальную переменную, используя window.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

Конечно, если вы работаете в строгом режиме, вам нужно быть осторожным и с подразумеваемыми глобальными переменными.
Это все, что я могу придумать, что с вашим кодом что-то не так. что происходит на самом деле...

person Elias Van Ootegem    schedule 28.06.2013
comment
@ user1671639: спасибо. И я бы не назвал ваш комментарий ошибкой, потому что объявления переменных подняты, в конце концов. С фрагментом OP как есть, oldA будет undefined, а oldA(param) в любом случае вызовет ошибку. Предоставление ОП ссылки на подъем в любом случае является хорошим вкладом. - person Elias Van Ootegem; 28.06.2013
comment
@EliasVanOotegem ( root || window ) выдает ошибку в консоли Mozilla Firefox. ReferenceError: root is not defined - person Mohammed Shareef C; 03.07.2017
comment
@Mohammed, если, конечно, root - это псевдоним глобального объекта в nodeJS. В браузерах просто используйте window - person Elias Van Ootegem; 03.07.2017

Чтобы получить доступ к глобальной переменной Js внутри функции, не используйте Var в области действия функции и упоминайте var в глобальной области. Например.

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

    alert(foo+"out side");
</script>
person gnganapath    schedule 03.11.2015