2011-12-14 19 views
3

我想學習codeacademy上的JS,我無法理解/得到這個東西。有人可以提供答案,也可以解釋爲什麼是這樣嗎?將深深感激。試圖找出示波器的工作原理

// This function tries to set foo to be the 
// value specified. 

function setFoo(val) { 
    // foo is declared in a function. It is not 
    // accessible outside of the function. 
    var foo = val; 
} 

setFoo(10); 

// Now that we are outside the function, foo is 
// not defined and the program will crash! Fix this 
// by moving the declaration of foo outside of the 
// function. Make sure that setFoo will still update 
// the value of foo. 
alert(foo); 
+0

你到底明白了什麼?您是否嘗試過*將foo的聲明移到函數*之外? – 2011-12-14 12:30:32

+1

嘗試此鏈接:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope – 2011-12-14 12:33:32

回答

2
// Create globale variable 
// (You should not use globale variables!) 
var foo; 

// set value 
function setFoo(val) { 
    foo = val; 
} 
setFoo(10); 

// show value 
alert(foo); 
2

只是聲明foo任何函數之外那麼這將是全球性的:

var foo = null; 

function setFoo(val) { 
    foo = val; 
} 

setFoo(10); 

alert(foo); 

試試吧!

3

您可以將範圍視爲一個術語,表示在代碼中特定「級別」可以達到哪些變量。在JavaScript中,這些「級別」是由函數定義的。每個功能都引入一個新的層次。

例如,利用這個示例代碼:

var a; 
// you can access a at this level 

function function1() { 
    var b; 
    // you can access a, b at this level 

    function function2() { 
    var c; 
    // you can access a, b, c at this level 
    } 
} 

所以你的情況,你應該聲明var foo;功能外,最好在它上面。然後你可以在setFoo內設置foo = val;foo然後是指您在setFoo以上的級別中聲明的那個。

foo可以在setFooalert這兩種方式下訪問;請將其與上面的示例代碼進行比較(function1setFoo,afooalert呼叫處於最高級別function2,bc不適用於您的情況)。

1

原始代碼:

function setFoo(val) { 
    var foo = val; 
} 

setFoo(10); 

alert(foo); // Crash! 

他們的建議來解決崩潰:通過移動foo的聲明功能

我猜你之外

修復此對於「在功能之外」意味着什麼感到困惑。

試試這個編輯的代碼:只在功能

var foo = 5; // "var" declares the variable to be in this outer scope 

function setFoo(val) { 
    foo = val; // but we can still access it in this inner scope... 
} 

setFoo(10); 

alert(foo); // Displays a dialog box that says "10" 
0

在函數中定義的變量有效

function setFoo(val) { 
    foo = val; 
} 
0

在JavaScript中,新範圍僅由功能創建

2

當你在Javascript中聲明一個變量,它只對與聲明的函數相同的函數或者該函數的函數有效。因爲foo最初是在SetFoo函數中聲明的,所以SetFoo以外的任何東西都不能看到它,所以對警報的調用將失敗,因爲foo不存在於gloabl作用域中。

正如註釋所示,將foo的聲明從函數移出到全局範圍(您可以認爲它是一個包含所有內容的全部函數),這將允許您在調用alert時使用foo。

var foo; 
function setFoo(val) { 
    foo = val; 
} 
setFoo(10); 
alert(foo); // No longer crashes 
2

Javascript中的每個函數都有它自己的範圍。這意味着你用var關鍵字定義的每個變量只會在該函數中可用。這意味着當你撥打setFoo(10)時,你創建了變量foo,給它一個5的值,之後它立即被銷燬,因爲它超出了範圍。

有多種方法可以解決這個問題。第一個是刪除var關鍵字。這將使foo進入全球範圍,這意味着它在任何地方都是可用的。然而,這是不鼓勵的,你想保持全局範圍儘可能的整潔,這樣如果你有多個人在同一頁面上提供javascript代碼,他們不能覆蓋其他人的變量。另一種方式來做到這一點會是這樣:

function setFoo(val){ 
    var foo = val; 
    alertfoo = function(){ 
     alert(foo) 
    } 
} 

在這個例子中,你在全球範圍內把唯一的事情就是alertfoo功能,因爲你想那是隨處可見。 alertfoo函數是在setFoo函數內定義的,這意味着儘管在執行setfoo之後foo應該已經超出了範圍,但它仍保存在內存中,因爲alertfoo可以訪問它。

這使得一些不錯的技巧。例如,假設您正在製作一個將包含在其他人頁面上的JavaScript庫,您將需要在其中創建一個可以定義變量的範圍,而不會污染全局範圍。執行此操作的最常見方法是聲明自動執行功能。這是被定義後立即執行的功能,它看起來像這樣:

(function(){ 
    //set variables you want to be global in your own code 
    var mainpage = document.getElementById('main'); 

    //define functions you want to make available to other people in a way that puts them in the global scope 
    setMainElement = function(newmain){mainpage = newmain;} 
})(); 

可以使這甚至通過使只有一個對象的全球更好,並通過對象的方法提供您interfae,這樣,您將創建一個包含您的庫所包含的所有函數的名稱空間。下一個示例使用對象字面值來執行此操作。在JavaScript中,您可以通過在花括號中放置鍵/值對來創建對象。鍵/值對是對象的屬性。例如:

(function(){ 
    var privatevar = 10,otherprivate=20; 

    publicInterface = { 
     'addToPrivate': function(x){privatevar+=x;}, 
     'getPrivate': function(){return private} 
    }; 
})();