2012-11-19 73 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