2012-09-18 106 views
0

让我们假设我们有一个JavaScript函数,我们要检查,如果第二个参数是未定义,在这种情况下,我们要为它分配一个值,如带有未定义参数的JavaScript函数和参数在函数体中定义,是一个全局变量?

function myFunc(a,b){ 
    if(typeof b==="undefined"){ 
     b=0; 
    } 
    //do stuff 
} 

在是否可变bif block还是指函数的参数还是全局变量名为b是否创建?分别为Activation Object(ES3)

干杯

+0

非常感谢你们的答案! – r366y

回答

1

代码:

function myFunc(a,b){ 
    if(typeof b==="undefined"){ 
     b=0; 
    } 
    console.log('b from myFunc:'+b) 
} 
myFunc(5); 
console.log('global:'+b) 

输出:

b from myFunc:0 

b is not defined 
3

是,blexicalEnvironment(ES5)得到解决。它将始终在本地解决,即使全局变量b存在以及通过访问纯名称。

您需要分别明确地呼叫window.bglobal.b(节点)才能访问具有相同名称的全局变量。

2

它指的是函数的参数。你可以像这样测试自己:

var b = 45; 
function myFunc(a,b){ 
    if(typeof b==="undefined"){ 
     b=0; 
    } 
    alert(b); //It will output 0 
    //do stuff 
} 

myFunc(''); 
1

的JavaScript首先会在局部范围内的任何一个局部变量或命名函数参数。如果它在那里找到符号,那么该变量就是使用的那个。

仅当找不到匹配的本地符号时才使用全局符号。

因此,在您的示例中,您将设置函数参数的值b

一旦您在本地变量或命名函数参数中定义了本地符号,就不能再使用该名称来访问同名的全局变量。如果您特别想要解决全局变量,您可以在前加上window.作为前缀。这特别针对全球范围,因此不使用本地范围。

1

变量停留在函数if;

  1. 可变使用var或没有它
  2. 的变量声明与this函数内声明作为它的父节点的功能,例如低于

    function foo(){ this.bar = 'hello'; }

的变量在全球范围内变得可用时

  1. 可变使用var或不具有任何功能之外声明它

  2. 的变量声明为它的父节点是window例如低于

window.bar ='i am global'

-1

你需要限定可变GLOBALLY:

在下面的代码中,t2是未定义的。

<script> 

var t1=""; 
var t2; 
function check(t1,t2){ 
if (t1===undefined) 
{ 
alert("t1 is undefined"); 
} 
if (t2===undefined) 
{ 
alert("t2 is undefined"); 
} 
} 
</script> 

REF: http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_undefined

+0

-1:w3cschools和全局...一个组合几乎像暗示'eval'一样邪恶# –

+0

@EliasVanOotegem我提供了一个关于代码发布的工作解决方案。由于这个问题没有要求最好的解决方案。 –

+0

不,您没有:OP想知道当参数未定义时,如果该变量将被设置为全局变量,那么您将为其分配一个值。你没有在你的回答中解决这个问题。 OP想要知道,如果坚持你的例子,你的函数被称为'check();',未定义参数't1'和't2',它会改变全局对象,如果在函数内部会有一个像't1 ='foo';' –

2

通过@Andre和@Nelson的答案都是正确的,但只是为了清楚起见:

var c = 123; 
var func = (function(a)//a === 1234 
{ 
    var b = c;//local b === global c 
    return function(a,c) 
    { 
     console.log(c === b);//false, unless second argument was 123 
     console.log(a === 1234);//false, unless first arg was 1234 
     console.log('a masks the a of the outer scope'); 
    }; 
})(1234); 

JS会先扫描被调用函数的范围,对于任何使用的变量,如果它没有在那里找到它,它会移动到外部范围。这可能是另一个功能,或者最终是全球范围。在此示例中,内部函数(返回)将无法访问外部函数中定义的值a。它在外部函数返回时被GC'ed,因为它没有被引用到任何地方。