2011-12-08 65 views
1

我不能設法改變「我」不管我怎麼努力的價值...瞭解本地範圍

我的代碼如下:

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函數更改'我'(在MyFunction)的值?

另外:我非常需要閱讀一些指南,有人可以給我一個好的鏈接?

+0

*「瞭解本地範圍」*本地範圍是通過函數聲明定義的。當你使用'var'語句聲明變量的函數中時,變量在本地作用域中定義。該函數之外的任何內容都不會訪問該變量。 – RightSaidFred

+0

人們似乎喜歡[Eloquent JavaScript](http://eloquentjavascript.net/)。 [Chapter 2](http://eloquentjavascript.net/chapter2.html)具有變量的基礎知識,然後[Chapter 3](http://eloquentjavascript.net/chapter3.html)進入函數的變量範圍。 – RightSaidFred

回答

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 
+0

我可以定義我是否需要,但是我需要使用'window.i'來訪問全局權限? – ajax333221

+0

@ ogps92 - 只有當您在本地範圍內也定義了'i'時。如果範圍鏈中唯一定義的'i'(通過'var i')是'window.i',那麼簡單地引用'i'就可以。 – gilly3

+0

我打算接受別人的回答,但是你的編輯太強大了,不接受它會是錯誤的 – ajax333221

0
function myFunction(){ 
    var i; 

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

而changeValue():

changeValue(){ 
return new_i; 
} 
1

你可以簡單地返回值:當您內myFunction使用var

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

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

,它成爲在該範圍內的局部變量。所以你無法在外面任何地方訪問它,無論你嘗試多麼困難。

使用window.i,而不是在兩地var i,它應該工作,


你可以簡單地避免window.並直接使用i沒有var前綴,甚至將兩者的功能外var i聲明......但變量有效地成爲window對象的一部分。 (通常,JS中的所有全局變量都是window對象的一部分)

+0

這是很好的知道,我總是使用不同的變種名稱,因爲我認爲他們會以某種方式干擾,如果我在func裏面使用func! (但是現在我明白只有Global vars纔會發生) – ajax333221

+0

把'i'這樣一個通用命名的變量附加到'window'上可能是一個非常危險的想法。這可能會帶來比解決問題更多的問題。 – arb

+0

真正解釋了變量如何被作用域的答案會得到反對票嗎? – RightSaidFred

0

您只能操作範圍內的變量。目前,i的範圍侷限於myFunction()

This是一篇很好的文章,讓你開始理解JavaScript中的作用域規則。

0

兩個changeValuemyFunction在全球範圍內存在。如果您在myFunction中定義了i,則只能在myFunction及其子項(在myFunction中定義的函數)內進行訪問。 '範圍鏈'(我只是想了一個字)看起來像這樣:

myFunction <- window 

changeValue也存在於全局範圍內。它是從myFunction調用的,但不會改變它存在的範圍。它的作用域鏈是這樣的:

changeValue <- window 

如果你只使用changeValue內myFunction的,你可以這樣做:現在

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

changeValue的作用域鏈是這樣的:

changeValue <- myFunction <- window 

由於i存在於myFunction中,現在也存在於changeValue中。