带有未定义参数的Javascript函数和参数是在函数体中定义的,是一个全局变量吗?

时间:2012-09-18 08:36:30

标签: javascript

让我们假设我们有一个javascript函数,我们想检查第二个参数是否是 undefined ,在这种情况下我们要为它分配一个值,例如

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

if 块中的变量 b 是否仍然引用函数的参数或者创建名为 b 的全局变量?

干杯

7 个答案:

答案 0 :(得分:3)

是的,b分别在lexicalEnvironment(ES5)Activation Object(ES3)中得到解决。它将始终在本地解析,即使存在全局变量b以及访问纯名称也是如此。

您需要分别显式调用window.b global.b(节点)来访问具有相同名称的全局变量。

答案 1 :(得分:2)

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

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

myFunc('');

答案 2 :(得分: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,因为它没有被引用到任何地方。

答案 3 :(得分: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

答案 4 :(得分:1)

Javascript首先在本地范围内查找局部变量或命名函数参数。如果它在那里找到符号,那么该变量就是使用的那个。

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

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

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

答案 5 :(得分:1)

变量保留在函数if;

  1. 使用var或不使用
  2. 在函数内声明变量
  3. 变量用this声明,因为它的父节点是函数,例如

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

  4. 时,变量在全局范围内变为可用
    1. 使用var或不使用window声明变量在任何函数之外声明

    2. 声明变量,因为它的父节点是window.bar ='i am global'示例

    3. {{1}}

答案 6 :(得分:-1)

你需要全球定义变量:

在下面的代码中,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