2012-11-19 72 views
2

我想頁腳只是在初始位置下面的窗口,當我調整窗口的大小。我需要在函數內外聲明var以使其工作。沒關係,還是有更好的方法來做到這一點?jQuery的全局變量

$(function(){ 

    // initial position:  
    var docHeight = $(window).height(); 
    $('#footer').css('margin-top', docHeight + 'px'); 

    // position when I resize the window: 
    $(window).resize(function() { 
    var docHeight = $(window).height(); 
     $('#footer').css('margin-top', docHeight + 'px'); 
    }); 

}) 

我的代碼這裏玩:http://jsfiddle.net/dWpp5/

+7

從不信任w3fools ... – Christoph

+3

[W3Schools的是這麼好了錯誤的信息,知道它的共同舉w3fools(http://w3fools.com/)。 – zzzzBov

+0

這個概念與jQuery無關,這是純粹的JavaScript問題。在你的示例代碼中,'docHeight'將會變成全局的,因爲你不用'var'來設置它。您可以在[this fiddle]中清楚地看到它(http://jsfiddle.net/dWpp5/1/),它甚至可以在內聯按鈕單擊事件中使用。你到底在問什麼? –

回答

1

該作品一樣好:

$(function(){ 

    // initial position:  
    // this is a variable local to the doc ready function 
    var docHeight = $(window).height(); 
    $('#footer').css('margin-top', docHeight + 'px'); 

    // position when I resize the window: 
    $(window).resize(function() { 
     // since this function is contained within the outer function, 
     // the docHeight local from the outer scope is accessible here. 
     $('#footer').css('margin-top', docHeight + 'px'); 
    }); 
}) 

// Here, however, docHeight is NOT accessible. 
+0

如果我在這裏使用你的代碼jsfiddle.net/dWpp5頁腳不更新他的調整大小位置窗口。它需要在調整大小函數中重複var。也許我沒有很好地解釋這個問題,我更新了這個問題。 – Nrc

+0

@Nrc:聽起來你的投訴不是關於變量的範圍,而是關於更新值。當你做'var docHeight = $(window).height()'時,函數返回一個*拷貝到變量的數字。如果窗口高度發生變化,那麼'docHeight'中的值不會被更新。你將需要再次調用'.height()'函數。 –

+0

@Nrc:看[這個小提琴](http://jsfiddle.net/dWpp5/3/),這是你正在嘗試做什麼? –

2

JavaScript有 「函數作用域」。所以就像你說的,如果你用「var」關鍵字定義一個變量,它就變成了它所在的任何功能塊的本地。任何超出該功能的東西都看不到它。

但是,如果您不使用「無功」來定義一個變量,或者使用「無功」,而是一個功能之外 - 這是一個全局變量,任何功能或表達訪問。

約函數作用域涼爽的是,儘管指出的是,函數外部可以看到該變量 - 被執行或父函數做內部定義的任何功能。

孔深藏 - 如果你在一個函數中使用的變量,函數沒有看到它的自身內部定義的,它進入其母公司,看看它的定義存在。如果它沒有找到一個定義 - 它會轉到它的父項的父項 - 依此類推,直到它到達全局範圍 - 如果它沒有在全局範圍中找到一個定義,則該變量在全局範圍中被聲明。

Here's a Smashing Magazine article on scoping.

+0

在我的示例中,如果我不重複調整大小函數內的var,它不起作用。它似乎沒有得到它的父母的變種? – Nrc

+0

這裏是一個例子http://jsfiddle.net/dWpp5/2/ – tbwiii

+0

我想我理解你對範圍的解釋。它很清楚,很好地解釋。我更新了這個問題,使其更加清晰:在我的示例中,我需要兩次使用var來產生我期待的效果。它是正確的還是有更好的方法來做到這一點? – Nrc