0

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

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

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

干杯

4

7 回答 7

3

是的,分别在(ES5)(ES3)b中得到解决。即使通过访问纯名称也存在全局变量,它也将始终在本地解析。lexicalEnvironmentActivation Objectb

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

于 2012-09-18T08:38:28.320 回答
2

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

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

myFunc('');
于 2012-09-18T08:38:37.140 回答
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 将首先扫描被调用函数的范围,对于任何使用的 var,如果它没有在那里找到它们,它会移动到外部范围。这可以是另一个函数,或者最终是全局范围。在此示例中,内部(返回)函数将无法访问a外部函数中定义的值。当外部函数返回时,它被 GC 处理,因为它没有在任何地方被引用。

于 2012-09-18T08:48:22.320 回答
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
于 2012-09-18T08:41:21.663 回答
1

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

仅当未找到匹配的局部符号时才使用全局符号。

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

一旦在局部变量或命名函数参数中定义了局部符号,就不能再单独使用该名称来访问同名的全局变量。如果您特别想处理全局变量,可以通过在其前面加上window.as in 来实现window.b。这专门针对全局范围,因此不使用本地范围。

于 2012-09-18T08:43:30.717 回答
1

变量保留在函数上,如果;

  1. var使用或不使用它在函数内部声明变量
  2. 变量被声明this为它的父节点函数,下面的例子

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

变量在全局范围内可用时

  1. var变量在使用或不使用它的任何函数之外声明

  2. 该变量被声明为它的父节点是window下面的例子

window.bar ='i am global'

于 2012-09-18T08:44:10.180 回答
-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>

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

于 2012-09-18T08:47:07.547 回答