使用Scripts.Render MVC4时的Javascript全局变量

使用Scripts.Render MVC4时的Javascript全局变量,javascript,asp.net-mvc-4,global-variables,render,Javascript,Asp.net Mvc 4,Global Variables,Render,我有一个利用javascript绑定的MVC4项目 在我的\u Layout.cshtml页面中,我有如下内容: @Scripts.Render("~/bundles/scripts/desktop/modernizr", "~/bundles/scripts/desktop/jquery","~/bundles/scripts/desktop/jqueryui", "~/bundles/scripts/desktop/jqueryvalidation",

我有一个利用javascript绑定的MVC4项目

在我的
\u Layout.cshtml
页面中,我有如下内容:

    @Scripts.Render("~/bundles/scripts/desktop/modernizr",
        "~/bundles/scripts/desktop/jquery","~/bundles/scripts/desktop/jqueryui",
        "~/bundles/scripts/desktop/jqueryvalidation", "~/bundles/scripts/custom")
还有其他的,但这只是一个例子。在自定义脚本中调用的一个脚本中,我需要引用在ready函数中设置的全局变量,如下所示:

  <script type="text/javascript">                   
     $(function () {            
         //alert('Page is ready!');
         var warning = 10;
         var timeout = 20;   }); </script>     

$(函数(){
//警报(“页面已准备就绪!”);
var警告=10;
变量超时=20;});
问题是,我似乎总是在需要warning和timeout变量的方法中得到一个错误。在如何创建这些变量的问题上,我是否遗漏了一些显而易见的东西(尽管对我来说不是!)?我应该
var
$Ready
之外加载它们吗,因为js是在页面技术就绪之前加载的

如果所有内容都已在渲染包中,并且没有脚本块,那么全局变量应该放在哪里


谢谢

警告和超时变量不是全局变量。它们仅在您提供给
$
函数的函数中定义

我通常建议尽可能避免使用全局变量,但如果您真的想创建全局变量,请使用以下方法:

<script type="text/javascript">
   var warning = 10;
   var timeout = 20; 
</script>     

var警告=10;
var超时=20;
或者这个:

<script type="text/javascript">
   $(function () {
       window.warning = 10;
       window.timeout = 20;   
   });
</script>     

$(函数(){
window.warning=10;
window.timeout=20;
});

感谢您的回复

我认为在Ready页面中添加变量是行不通的。需要这些变量的函数是在页面“就绪”之前加载的(根据我的理解,这一切都是如何工作的),因此在新页面加载时,会出现需要变量但未引用变量的情况

这就是我目前的处理方式:

我创建了一个新的.js文件,其中包含以下内容:

    var warning;
    var timeout;

然后,我创建了一个对该文件的绑定引用,并将其按正确的作用域顺序放入my@Script.Render stmt中。现在,我有了全局变量,它被干净地实现到我的视图代码中。现在,我知道我应该传递变量,而不是让它们成为全局变量,但在这种情况下,我看不出有什么大问题。

您建议避免使用全局变量。我知道
全局变量(或函数)可以覆盖窗口变量
。这是你的观点吗?@MazdakShojaie一般来说,污染全球范围是不好的做法,原因有很多。将变量保留在其有用的范围内有助于理解代码并防止意外行为,如变量被无关函数修改或意外引用内置全局属性,如
Window.name
。关于这一点,我们有一个详细的讨论,但一定要仔细阅读。非常感谢,
w3cwiki
链接非常有用。