41

声明全局 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);
4

8 回答 8

86

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

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

    MyProject.intro = "something";
});

console.log(MyProject.intro); // "something"
于 2012-06-22T08:53:29.643 回答
35

声明这个

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。

您在 DOM 就绪执行之前执行外部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

于 2012-06-22T08:51:20.570 回答
16

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

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

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

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

于 2012-06-22T08:52:52.383 回答
7

window.intro$(document).ready(). _

于 2012-06-22T08:53:03.227 回答
3

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

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

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

于 2017-06-28T06:10:28.307 回答
2

像这样:把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>');
            }
        }
    });
});
于 2012-06-22T08:52:00.227 回答
2

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

<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(){});

于 2012-06-22T08:59:46.703 回答
1

window.intro = "value";在 ready 函数内部使用。如果你想要它可能"value"void 0undefined

于 2012-06-22T08:52:31.443 回答