2013-09-26 84 views
3

執行javascript函數時,如何決定使用的變量是本地還是全局?因爲我只想記錄對全局變量的修改。如何在javascript中檢查變量是本地還是全局?

<script> 
    var a; 
    a =4; 

    function foo(){ 
     var a =3; 
    }() 

</script> 

當執行上面的代碼時,我只想記錄a = 4,而不是a = 3;

+1

我不認爲你可以像你想要的範圍內訪問同名變量。解決方案:如果您需要訪問兩者,請使用唯一名稱。 –

+2

'window.a'應該引用全局變量,但我從來沒有這樣做過(在不同的範圍中重複使用相同的變量名),所以我不知道潛在的注意事項。 – Jasper

+0

我想用JavaScript代碼來記錄對全局變量的修改。上面的代碼只是一個例子。 – user2751079

回答

7
<script> 
    var a; 
    a = 4; 
    function foo(){ 
    // version 1: 
    if (window.hasOwnProperty('a')){ 
     // "global" a exists 
    } 
    // version 2: 
    if (typeof window.a !== 'undefined'){ 
     // "global" a exists and is defined 
    } 
    }(); 
</script> 

這樣的事情?

+0

Typeof只告訴你類型,而不是它是否「存在」。 'in'運算符就是爲此。 – RobG

+0

那麼,恕我直言現有定義如果一個變量是否定義或不。但我想你可以在窗口中使用'window.hasOwnProperty('a')'或'a'。 –

+0

精確。 [so limit] – RobG

3

全局變量作爲全局對象的屬性添加,即瀏覽器中的窗口。爲了測試對象具有的屬性或沒有,使用in操作符:

// In global scope 
var bar; 

function foo() { 
    if (bar in window) { 
    // bar is a property of window 
    } else { 
    // bar isn't a property of window 
    } 
} 

對於更一般代碼,環境可能不具有窗口對象,所以:

// In global scope 
var global = this; 

function foo() { 
    if (bar in global) { 
    // bar is a property of the global object 
    } else { 
    // bar isn't a property of the global object 
    } 
} 

當心typeof測試。他們只告訴你變量值的類型,並返回undefined如果屬性不存在它的值已被設置爲undefined

0

我知道這個問題很老,但我一直在尋找同樣的東西。當我無法找到答案,我結束了想出這樣的:

<script> 
var a; 
a = {prop1: 'global object'}; 

(function foo() { 

    var a = {prop1: 'local object'}; 

    var isLocal = true; 
    if (window.hasOwnProperty('a')) { 
     if(Object.is(a, window['a'])) { 
      isLocal = false; 
     } 

    } 
})(); 

</script> 

如果一個變種是一個原始值,然後Object.is()將始終返回true,所以你需要一些其他的對付他們的方式。

相關問題