I want to use global variable 'x' in the below hook funcion.
var x = 10; //global variable
var oldA = a;
a = function a(param){
alert(x); //showing error: x is undefined
return oldA(param);
}
How to resolve the error?
Your code works fine for me, but you might want to resolve x to the global variable explicitly by using window.x.
When not in a browser environment, or an environment where the global object isn't called window, try:
(window || root || global || GLOBAL || this || self || {x: undefined}).x
The {x:undefined} object literal is just to make sure the expression doesn't throw up errors.
I've listed pretty much all names I know of that are given to the (strictly speaking nameless) global object, just use the ones that might apply to your case.
On the other hand, if the global variable x might be reassigned by the time the function (a) gets called, a closure would be preferable:
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
Of course, if you're in strict mode, you need to be careful with implied globals, too.
That's all I can think of that is going wrong with your code, some more details might provide us with a clue of what's actually happening...
oldA will be undefined, and oldA(param) will throw an error either way. Providing the OP with a link on hoisting is a nice contribution either way.( root || window ) throws error in mozilla firefox console. ReferenceError: root is not definedroot is an alias for the global object in nodeJS. In browsers, just use window
acannot be hoisted here, as it's an expression. The only thing that gets hoisted here, are the variable declarationsnodeenvironment? In that case, tryglobal.x = 10;&alert(global.x). Actually, polluting global object is not a good idea. But, you might want to try it.