从jQuery中的函数外部访问变量

时间:2011-11-04 11:39:07

标签: scope javascript

请参阅我的摘要:

var AbcVar = "abc";

function Abc(AbcVar){
  console.log(AbcVar);
}

这是允许函数访问external var的错误方法吗?

为什么console.log undefined的输出?

4 个答案:

答案 0 :(得分:5)

是时候见到斯科平先生了。

简单地说,范围是变量的封装(请注意,在javascript中,函数也是变量。)现在,在我刚刚编写的虚构语言中,{字符开始一个范围并{{1}结束它,变量用简单的相等定义(例如}):

x = 42

javascript有词汇范围。简而言之,函数创建了一个新范围:

{                                                                    |
    x = 42;                                                          |
    {                                           |                    |
        y = "I'm in an inner scope!";           |                    |
        x == 42; //true                         |                    |
        {                                  |    |                    |
            x == 42;                       |    |                    |
            y == "I'm in an inner scope!"; |    |                    |
                                           | x, y, z are defined     |
            z = "pyramid time!";           |    |                    |
            y = y + "...not";              |    | x, y are defined   | x is defined
        }                                  |    |                    |
        y == "I'm in an inner scope!...not";    |                    |
        //z is not defined                      |                    |
        x = 4;                                  |                    |
    }                                           |                    |
    x == 4;                                                          |
    //y is undefined                                                 |
    //z is undefined                                                 |
}                                                                    |

现在,还有一个可以创建变量的地方,那就是函数参数。以下两个函数的行为相同(var x = 42; (funciton () { x === 42; var y = 5; })(); //y is undefined 是包含传递给函数的参数的伪数组):

arguments

如果您碰巧没有传递参数,其值将为function parameterfull(a, b, c) { //do stuff with a, b, c } function parameterless() { var a = arguments[0], b = arguments[1], c = arguments[2]; //do stuff with a, b, c }

现在,使用您的功能和上述翻译:

undefined

现在你看到为什么var AbcVar = "abc"; function Abc() { var AbcVar = arguments[0]; console.log(AbcVar); } (有时)AbcVar在函数内部。


tl; dr 函数参数undefined正在覆盖全局变量AbcVar,并且因为您没有将值传递给函数,所以它是{{1} (但仅在函数内部,全局AbcVar保持不变。)

答案 1 :(得分:1)

在函数内部,AbcVar将引用该函数的参数 AbcVar。如果未传递任何参数,则值为undefined

参数 shadow 更高范围内具有相同名称的变量。 如果要访问它,则必须删除或重命名参数。也就是说,你应该总是喜欢将参数传递给函数(如果可能的话)。

答案 2 :(得分:0)

如果您运行刚刚创建的功能并将其传递给AbcVar

console.log(AbcVar);

按预期记录"abc"

考虑以下代码

var AbcVar = "abc";

function logVariable(passedIn){
  console.log(passedIn);
}

logVariable(AbcVar);

创建一个变量,一个记录变量值的函数,然后将变量传递给记录器,记录器在控制台中记录它

如果您在运行记录器功能后发现交互​​式控制台上有两行:abc后跟undefined

console result

第一个是调用console.log()时打印的行,第二个是执行后logVariable返回的值,成功时为undefined

答案 3 :(得分:0)

嗨,您可以将其更改为

  var AbcVar = "abc";

        function Abc(bbb){

            console.log(AbcVar);

        }

你可以访问外部全局变量,如果你写内部函数,它就像假设一样;

var AbcVar = "abc";

            function Abc(var AbcVar){

                console.log(AbcVar);

            }

 so inside funciton AbcVar is new vaiable  and null ,it shadow global AbcVar