我一直在观看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 .
4 回答
因为这一行
仅设置函数参数的值,而不是传入的变量的值 . 但是,函数内的
bob
被解释为对全局变量的引用,因此它会修改外部值 .但请注意,对象是引用,所以如果你这样写:
然后调用
funky
会直接修改参数引用的对象 .是的,了解参数的传递方式非常重要 .
参数仅在函数范围内保存其值 . 全局变量是全局变量,因此如果在函数内部修改它们,它们会将该值保留在函数之外 .
另外,请注意隐藏 - 如果参数与全局变量具有相同的名称,则该参数会将该变量隐藏在该函数的范围内 .
好的,所以下面的例子会让你更加困惑 .
var a = {'a':'A'};
function foo(param){param.a ='B';}
FOO的(a);
//现在打印一个{'a':'B'}
这是一个重要的概念:
至于更多信息,您可以查看以下答案:Does Javascript pass by reference?
关于这个:
不要将
parameter
视为hello
的别名 . 它们是不同的变量 . 他们可以自由地指出不同的事情 . 在这种情况下将值_11408369_分配给parameter
对hello
没有影响 . 在该行之后,全局变量hello
仍指向空数组 . 只有parameter
指向null .此外,
funky(hello)
将hello
的值传递给funky
函数 . 考虑以下:执行
addElements
后,全局arr
仍为空 . 函数内的arr
与全局范围中的arr
不同 . (我应该注意,每个arr
的内容可能指向相同的对象,但这是一个单独的问题 . )(另请注意some languages do allow the sort of aliasing you seem to expect,但这不是JavaScript中传递参数的方式 . )
JavaScript假定如果为变量赋值,则它在全局范围内 - 除非该变量是使用
var
声明的 . 例如,这个:由于函数的
bob
变量是使用var
声明的,因此它由函数的本地范围拥有,并且对函数范围外声明的bob
没有影响 .关于对象在传递给函数时如何与原语不同,请查看Jonathan Snook的文章http://snook.ca/archives/javascript/javascript_pass以及来自@ p.s.w.g的有用评论 .