【问题标题】:Global javascript variable inside document.readydocument.ready 中的全局 javascript 变量
【发布时间】:2012-06-24 13:29:51
【问题描述】:

声明全局 javascript 变量的正确方法是什么?我试的方法不行

$(document).ready(function() {

    var intro;

    if ($('.intro_check').is(':checked')) {
        intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };

    $('.intro_check').change(function(){
        if(this.checked) {
            intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});

console.log(intro);

【问题讨论】:

  • 放置var 关键字使其成为函数的局部变量。要么删除它,要么将声明移到 ready 函数之外。

标签: javascript jquery global-variables scope


【解决方案1】:

您可以在没有 var 的文档就绪函数中定义变量,使其成为全局变量。在 javascript 中,没有 var 声明的任何变量都会自动成为全局变量

$(document).ready(function() {
    intro =  "something";
});

虽然你不能立即使用该变量,但它可以被其他函数访问

【讨论】:

  • 可爱!这么简单
【解决方案2】:

声明

var intro;

$(document).ready() 之外,因为$(document).ready() 会在全局范围内隐藏您的变量。

代码

var intro;

$(document).ready(function() {
    if ($('.intro_check').is(':checked')) {
        intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };
    $('.intro_check').change(function(){
        if(this.checked) {
            intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});

根据@Zakaria 评论

另一种方式:

window.intro = undefined;

$(document).ready(function() {
    if ($('.intro_check').is(':checked')) {
        window.intro = true;
        $('.intro').wrap('<div class="disabled"></div>');
    };
    $('.intro_check').change(function(){
        if(this.checked) {
            window.intro = false;
            $('.enabled').removeClass('enabled').addClass('disabled');
        } else {
            window.intro = true;
            if($('.intro').exists()) {
                $('.disabled').removeClass('disabled').addClass('enabled'); 
            } else {
                $('.intro').wrap('<div class="disabled"></div>');
            }
        }
    });
});

注意

console.log(intro);

在 DOM 就绪函数之外(目前你已经)将记录 undefined,但在 DOM 就绪函数中它会给你 true/false。

你的外部console.log在DOM准备好执行之前执行,因为DOM准​​备好在所有资源出现之后执行,即在准备好DOM之后,所以我认为你总是会得到荒谬的结果。


根据@W0rldart 的评论

我需要在 DOM 就绪函数之外使用它

您可以使用以下方法:

var intro = undefined;

$(document).ready(function() {
    if ($('.intro_check').is(':checked')) {
        intro = true;
        introCheck();
        $('.intro').wrap('<div class="disabled"></div>');
    };
    $('.intro_check').change(function() {
        if (this.checked) {
            intro = true;
        } else {
            intro = false;
        }
        introCheck();
    });

});

function introCheck() {
    console.log(intro);
}

更改intro 的值后,我调用了一个函数,该函数将以intro 的新值触发。

【讨论】:

  • 如果我的理解是正确的,那么问题是关于在$(document).ready() 函数中声明一个全局变量。
  • @Zakaria 我不在乎变量是在哪里声明的,我只需要它是全局的,这样我就可以从任何地方访问它
  • @w0rldart 你在 DOM 就绪函数之外的 console.log(目前你已经)将记录 undefined,但在 DOM 就绪函数中它会给你 true/false。
  • @thecodeparadox 我需要在 DOM 就绪函数之外使用它,因为稍后我将在 tinymce 中使用它来知道要激活什么
  • @w0rldart 你的外部console.log在DOM准备好执行之前执行,因为DOM准​​备好在所有资源出现到DOM之后执行,即在DOM准备好之后,所以我认为你总是会得到荒谬的结果。跨度>
【解决方案3】:

JavaScript 具有 Function-Level 变量范围,这意味着您必须在 $(document).ready() 函数之外声明变量。

或者让你的变量具有 global 范围,只是不要在它之前使用var 关键字,如下所示。然而,这通常被认为是不好的做法,因为它污染全局范围,但由您决定。

$(document).ready(function() {
   intro = null; // it is in global scope now

要了解更多信息,请查看:

【讨论】:

  • 由于某种原因,它不会去!当我尝试alert(intro)console.log(intro) 时,它一直返回未定义。我尝试了该线程中提出的几乎所有解决方案
  • @w0rldart:应该还有其他问题。确保您没有在其他地方重新定义该变量,并注意 javascript 提升:adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting。并在ready 处理程序中尝试您的console.log 命令,您可以在该处理程序中操作intro 变量。
【解决方案4】:

与其他编程语言不同,在任何函数之外声明的任何变量都会自动变为全局变量,

<script>

//declare global variable
var __foo = '123';

function __test(){
 //__foo is global and visible here
 alert(__foo);
}

//so, it will alert '123'
__test();

</script>

您的问题是您在 ready() 函数内声明变量,这意味着它仅在 ready() 函数内可见(在范围内),但在外部不可见,

解决方案: 所以让它成为全球性的,即在$(document).ready(function(){});之外声明这个@

【讨论】:

    【解决方案5】:

    如果您要声明一个全局变量,您可能希望使用某种命名空间。只需在外面声明命名空间,然后你可以将任何你想要的东西扔进去。像这样……

    var MyProject = {};
    $(document).ready(function() {
        MyProject.intro = "";
    
        MyProject.intro = "something";
    });
    
    console.log(MyProject.intro); // "something"
    

    【讨论】:

    • 不是 OP 要求的,但更干净。不过,我更喜欢闭包,除非代码是模块化的,并且需要跨模块访问全局变量。
    • @dbaseman,我喜欢你的解决方案,因为它可以解决一些问题并改进我的一些代码(代码是预构建的,我只是改进它)......但是由于某种原因,当我声明MyProject.intro = "something"; 在 DOM Ready 函数中,我不断得到 undefined 作为 console.log 中的输出@
    • @w0rldart 在 OP 代码和接受的答案中,控制台日志位于 $(document.ready(...)) 之外。所以在大多数情况下,console.log 会在 JS 加载完成时运行,之后会在所有 DOM 准备好时执行 Ready 函数。
    • 谢谢!但是为什么我在 $(document).ready 中声明全局变量时不能 console.log() 呢?
    【解决方案6】:

    $(document).ready() 中使用window.intro

    【讨论】:

    • @OliverWeiler 全局变量不是每个人说的,但我想说的是,明确说明何时修改全局变量是一个很好的做法......
    【解决方案7】:

    在 ready 函数中使用window.intro = "value";"value" 可以是 void 0 如果你希望它是 undefined

    【讨论】:

      【解决方案8】:

      像这样:将intro 放在您的文档之外准备好,在这里很好的讨论:http://forum.jquery.com/topic/how-do-i-declare-a-global-variable-in-jquery @thecodeparadox 非常快:P 无论如何!

       var intro;
      
      $(document).ready(function() {
      
      
      
          if ($('.intro_check').is(':checked')) {
              intro = true;
              $('.intro').wrap('<div class="disabled"></div>');
          };
      
          $('.intro_check').change(function(){
              if(this.checked) {
                  intro = false;
                  $('.enabled').removeClass('enabled').addClass('disabled');
              } else {
                  intro = true;
                  if($('.intro').exists()) {
                      $('.disabled').removeClass('disabled').addClass('enabled'); 
                  } else {
                      $('.intro').wrap('<div class="disabled"></div>');
                  }
              }
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 2022-01-01
        相关资源
        最近更新 更多