2013-09-26 54 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,所以你需要一些其他的对付他们的方式。

相关问题