Javascript函数参数参数或全局变量

时间:2013-08-06 13:20:27

标签: javascript variables arguments

var x=10;
function foo(){
    x=120;
    alert(arguments[0]); //outputs 10
}
foo(x);

我怎么知道在函数中使用的x我是一个参数还是全局变量?在代码中

如果我提供了这个

function foo(x){
    x=120;
    console.log(arguments[0]);//logs 120
}
foo(x);

这两个代码之间的区别是什么,场景背后发生了什么以及如何更改参数数组?

2 个答案:

答案 0 :(得分:2)

var x=10; // this is variable of window namespace
  function foo(x){ 
// It will make variable of this functions. Every function make its own namespace. 
// So now you have x in local namespace, so you can't touch x from global 
// namespace, becouse you gave them same names. With for example function foo(a), 
// global x would be still accessible. 

          x=120; 
// Here, you change value of x. Program will ask the deepest namespace if there
// is any x variable. If not, it will continue upper and upper. Right now,
// we have local x variable, so it will change value of local variable, which
// will extinct at the end of our function. The most upper namespace is global
// namespace. One more deeper is window namespace. 

          alert(arguments[0]);
// arguments is Array, which every function has as its property. Via arguments,
// you can touch every argument, that is passed to function. Later, I will
// show you an example
        }
  foo(12);
// finaly here, you call function foo and you set local x = 12. But then,
// you rewrite local x, so it is 120. After all, you alert first argument,
// which is local x, which is 120. 

现在进行修改:

var x=10;
    function foo(a){ // now we have different name for local variable
        x=120; // so our x is x from window namespace
        alert(arguments[0]); // now output is a, which will be 12
        alert(x); // and x is 120
    }
foo(12);
alert(x); // x will be still 120... 

带有参数的不同故事

var x=10;
    function foo(){ // we didnt declare any local variable
        x=120; // so our x is x from window namespace again
        alert(arguments[0]); 
        // output is 12, becouse we can touch arguments via 
        // arguments array, even if we didnt declare any local variables
    }
foo(12);

基本参数函数属性允许我们做黑魔法。它使代码不易理解,但它非常强大。很少使用它们是个好主意。明智地使用它们......

参数和局部变量指向内存中的相同位置。所以改变一个会立即改变另一个。

答案 1 :(得分:1)

  

我怎么知道在函数中使用的x i是否是一个参数   还是全局变量?

检查功能的参数列表。如果它提到这样的参数x

function foo(x) {

然后你知道x是一个参数。它是arguments[0]的别名(另一个名称),因为它是第一个参数。 arguments对象不是真正的数组。它具有名称为数字的属性,并且它具有长度属性,因此它看起来像一个数组,但它缺少数组的其他功能。

您可以将arguments视为函数调用中传递的值的最终存储。参数名称是获取arguments中存储的值的便捷方式。

如果您的功能开始:

function foo() {

然后它没有参数。在函数内部引用的任何内容都必须是以另一种方式定义的值。它可以是函数内声明的局部变量:

function foo() {
    var x = 10;

或者它可以引用在您的函数之外声明的名称:

var x;

function foo() {
    x = 10;

在没有“严格模式”的JavaScript中,可以说:

function foo() {
    x = 10;

没有在任何地方声明var x。结果是x将被创建为全局变量(或全局对象的属性,例如在它将创建的浏览器中window.x)这是错误的一个重要来源,因为你可能拼错变量名而不是请注意,您正在为不存在的变量分配值。