2013-06-28 76 views
4

我想在下面的hook函數中使用全局變量'x'。如何訪問JavaScript中的函數鉤子的全局變量?

var x = 10; //global variable 

var oldA = a;  

a = function a(param){ 

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

    return oldA(param); 

} 

如何解決錯誤?

+0

也應該看看周圍[劃定範圍和提升](http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) – Praveen

+0

@ user1671639:分配給功能'了'_cannot是在這裏懸掛,因爲這是一個表達。唯一在這裏被升起的是變量聲明 –

+0

你是否處於'node'環境?在這種情況下,請嘗試'global.x = 10;'&'alert(global.x)'。其實,污染全球物體並不是一個好主意。但是,你可能想嘗試一下。 – 2013-06-28 11:27:29

回答

9

您的代碼對我來說工作正常,但您可能想要通過使用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 

當然,如果你是在嚴格模式下,您還需要小心隱含的全局變量。
這就是我所能想到的那就是你的代碼出錯了,更多的細節可能會爲我們提供實際發生的線索......

+0

+1關閉,並感謝糾正我的錯誤:) – Praveen

+0

@ user1671639:thx。我不會把你的評論稱爲錯誤,因爲變量聲明畢竟是懸而未決的。對於OP的代碼片段,'oldA'將會是'undefined','oldA(param)'會以任何方式拋出錯誤。向OP提供提升鏈接是一個很好的貢獻。 –

+0

@EliasVanOotegem '(root || window)'在mozilla firefox控制檯中拋出錯誤。 'ReferenceError:未定義根目錄' –

0

要訪問函數內部的全局Js變量,請不要使用Var in函數範圍並在全局範圍內提及var。例如,

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

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