首页 文章

变量与参数范围和分配值

提问于
浏览
3

我一直在观看Douglas Crockford的视频系列 . 关于将变量赋值为将变量赋值为全局变量的参数的关系,我有点困惑,让我演示一下 .

var bob = 22; //global scope
function funky(parameter){
    parameter = null; //sets the var passed in to null
    bob = 44; //sets the bob 
}

var hello = [];
funky(hello); // hello still has the value of an empty array even after the function is invoked.
bob; // value is 44

因此,当调用funky()时,'var bob'被赋值为44 . 此bob将新值保存在函数范围之外 .

var hello作为参数传递,而在funky中,它的值为null,在全局空间中调用hello时,它保存一个空数组的值 .

这只是我要记住的东西吗?如果全局范围中定义的变量作为参数传递,它只会在函数范围内保存它的新指定值吗?我是否在更广泛的范围内遗漏了一些参数如何传递并在函数中分配?

这是在函数/全局范围内外的具有console.log输出的代码的repl.it .

http://repl.it/NgN

4 回答

  • 1

    因为这一行

    parameter = null;
    

    仅设置函数参数的值,而不是传入的变量的值 . 但是,函数内的 bob 被解释为对全局变量的引用,因此它会修改外部值 .

    但请注意,对象是引用,所以如果你这样写:

    function funky(parameter){
        parameter.hello = null;
    }
    

    然后调用 funky 会直接修改参数引用的对象 .

    var x = { hello: [] };
    funky(x); // x => { hello: null }
    

    这只是我要记住的东西吗?

    是的,了解参数的传递方式非常重要 .

    如果全局范围中定义的变量作为参数传递,它只会在函数范围内保存它的新指定值吗?

    参数仅在函数范围内保存其值 . 全局变量是全局变量,因此如果在函数内部修改它们,它们会将该值保留在函数之外 .

    另外,请注意隐藏 - 如果参数与全局变量具有相同的名称,则该参数会将该变量隐藏在该函数的范围内 .

  • 1

    好的,所以下面的例子会让你更加困惑 .

    var a = {'a':'A'};

    function foo(param){param.a ='B';}

    FOO的(a);

    //现在打印一个{'a':'B'}

    这是一个重要的概念:

    基元按值传递,对象通过“引用副本”传递 .

    至于更多信息,您可以查看以下答案:Does Javascript pass by reference?

  • 3

    关于这个:

    var hello作为参数传递,而在funky中,它的值为null,在全局空间中调用hello时,它保存空数组的值 .

    不要将 parameter 视为 hello 的别名 . 它们是不同的变量 . 他们可以自由地指出不同的事情 . 在这种情况下将值_11408369_分配给 parameterhello 没有影响 . 在该行之后,全局变量 hello 仍指向空数组 . 只有 parameter 指向null .

    此外, funky(hello)hello 的值传递给 funky 函数 . 考虑以下:

    var arr = [];
    
    function addElements(arr) {
        arr.push(5);
        arr.push(77);
    }
    

    执行 addElements 后,全局 arr 仍为空 . 函数内的 arr 与全局范围中的 arr 不同 . (我应该注意,每个 arr 的内容可能指向相同的对象,但这是一个单独的问题 . )

    (另请注意some languages do allow the sort of aliasing you seem to expect,但这不是JavaScript中传递参数的方式 . )

  • 1

    JavaScript假定如果为变量赋值,则它在全局范围内 - 除非该变量是使用 var 声明的 . 例如,这个:

    var bob = 22; //global scope
    function funky(parameter){
        parameter = null; //sets the var passed in to null
        var bob = 44; //sets the bob 
    }
    var hello = [];
    funky(hello); // hello still has the value of an empty array even after the function is invoked.
    bob; // value is 22
    

    由于函数的 bob 变量是使用 var 声明的,因此它由函数的本地范围拥有,并且对函数范围外声明的 bob 没有影响 .

    关于对象在传递给函数时如何与原语不同,请查看Jonathan Snook的文章http://snook.ca/archives/javascript/javascript_pass以及来自@ p.s.w.g的有用评论 .

相关问题