了解本地范围

时间:2011-12-08 19:16:52

标签: javascript

无论我怎么努力,我都无法改变'i'的价值......

我的代码如下:

function changeValue(){
    //neither 'var i=99;' or 'i=99;' interferes with the 'i' on myFunction
}

function myFunction(){
    var i;

    for(i=0;i<3;i++){
        alert(i);
        changeValue();
        alert(i);
    }
}

myFunction();

我的问题:如何使用 changeValue 函数更改'i'(在 MyFunction 上)的值?

另外:我非常需要阅读一些关于此的指南,有人可以给我一个好的链接吗?

6 个答案:

答案 0 :(得分:2)

changeValue()移至与i相同的范围内:

function myFunction(){
    var i;
    for(i=0;i<3;i++){     
        alert(i);     
        changeValue();     
        alert(i);     
    }
    function changeValue() { i = 99; }
}

或者,将i放在与changeValue()相同的范围内:

var i;
function changeValue() { i = 99; }
function myFunction(){   
    // var i; // don't define i here
    for(i=0;i<3;i++){     
        alert(i);     
        changeValue();     
        alert(i);     
    }     
}    

或者,您可以告诉changeValue() i的值是什么,然后让它返回新值:

function changeValue(i) {
    return i + 1;
}

然后:

i = changeValue(i);

编辑:说明范围:

var a = 0;  //  global scope - accessible everywhere via a
            //  unless overridden by a locally scoped a
            //  always accessible via window.a

function doSomething () {
    var a = 1;  //  local scope - you can still access window.a
    var b = 2;  //  local scope - accessible to child scopes, but not global scope

    function innerFunction () {
        var a = 3;  //  you no longer have access to the parent function's a variable
                    //  you can still access window.a
        var c = 4;  //  only accessible here (since no child scopes exist)

        alert(window.a);  //  0
        alert(a);         //  3
        alert(b);         //  2
        alert(c);         //  4
    }

    innerFunction();

    alert(window.a);  //  0
    alert(a);         //  1
    alert(b);         //  2
    alert(c);         //  undefined - unavailable in this scope
}

doSomething();

alert(window.a);  //  0
alert(a);         //  0
alert(b);         //  undefined - unavailable in this scope
alert(c);         //  undefined - unavailable in this scope

答案 1 :(得分:1)

您只需返回值:

function changeValue(i) {
 return i + 2;
}

 for(i=0;i<3;i++){ 
        alert(i); 
        i = changeValue(i); 
        alert(i); 
    } 

答案 2 :(得分:0)

function myFunction(){
    var i;

    for(i=0;i<3;i++){
        alert(i);
        i = changeValue();
        alert(i);
    }
}

而changeValue():

changeValue(){
return new_i;
}

答案 3 :(得分:0)

当您在var中使用myFunction时,它将成为该范围内的本地变量。所以你不能在外面的任何地方访问它,无论你怎么努力。

在这两个地方使用window.i代替var i,它应该有用,


您可以简单地避免window.并直接使用i而不使用var前缀,或者甚至将var i声明放在这两个函数之外......但实际上变量变为window对象的一部分。 (通常,JS中的所有全局变量都是window对象的一部分)

答案 4 :(得分:0)

您只能操作范围内的变量。目前,i的范围仅限于myFunction()

This是一篇很棒的文章,可帮助您开始了解JavaScript中的范围规则。

答案 5 :(得分:0)

changeValuemyFunction都存在于全局范围内。如果在myFunction中定义i,它只能在myFunction及其子函数中访问,函数在myFunction中定义。 '范围链'(我只想为它说一句话)看起来像这样:

myFunction <- window

changeValue也存在于全局范围内。它是从myFunction调用的,但不会改变它存在的范围。它的范围链是这样的:

changeValue <- window

如果你只在myFunction中使用changeValue,你可以这样做:

function myFunction() {
  function changeValue() { /* stuff */ }
  /* more stuff */
}

changeValue的范围链现在是这样的:

changeValue <- myFunction <- window

i中存在myFunction,现在它也存在于changeValue中。