在$(document).ready中实例化变量而不是全局声明它们是不好的做法吗?

时间:2017-08-02 15:28:10

标签: javascript jquery global-variables

我试图避免在我的代码中使用全局变量,所以我试图通过在$(document).ready内声明它们并将它们作为参数传递给{{1更新它们,然后从这些函数返回更新的值来操作$(document).ready内的变量。

另一种方法是使用$(document).ready输入字段来存储变量,但我也听说这是不好的做法。

我想知道我是否应该只使用全局变量,按照我目前的方式进行操作,还是使用隐藏的输入字段?

以下是我正在努力完成的一个简短示例。变量验证是我希望能够使用和更新的变量。

hidden

2 个答案:

答案 0 :(得分:0)

在下面立即执行的函数中声明的任何变量都不在全局范围内。

(function () {

  var someVar = 'someValue';

  $(document).ready(function() {

  });

})();

答案 1 :(得分:0)

  

$(document).ready内实例化变量而不是全局声明变量是不好的做法?

不,一点也不!变量应始终在其他地方需要的范围内声明。

  

另一种方法是使用隐藏的输入字段来存储变量,但我也听说这是不好的做法。

我从来没有听说过,但是这听起来确实是一种不好的做法。这与全局变量相同,但由于某些奇怪的原因存储在DOM中的全局变量。

  

我试图避免在我的代码中使用全局变量,因此我试图通过在$(document).ready内声明它们并将它们作为参数传递给外部函数来使用解决方法$(document).ready的更新,更新它们,然后从这些函数返回更新的值来操纵$(document).ready内的变量。

不可否认,这有点奇怪。

最简单的方法是在ready处理程序中移动函数声明,并直接在那里访问变量 - 还有一个没有scanValidation全局变量的额外奖励:

$(document).ready(function() {
    var validations = [];
    function scanValidation() {
        var scanval = $('#inp').val();
        if (validations.includes(scanval)) {
            //display error
        } else {
            var validarr = validations.slice();
            validarr.push(scanval);
            var myData = JSON.stringify({"name": "user1", "validations": validarr});
            // Makes an ajax call to see if the sent array validarr is a valid request
            apiCall(myData, 'scanValidation', function(decoded) {
                if (decoded.Status!="ERROR") {
                    validations = validarr;
                } else {
                    //display error
                }
            });
        }
    }

    $('#inp').keypress(function(e){
        if(e.which == 13){
            e.preventDefault();
            scanValidation();
        }
    });
});

如果你想使scanValidation可重用,以便可以从其他地方调用它自己的数组,我建议创建一个创建验证器的工厂函数,每个函数都是一个闭包它自己的数组。这样,数组被声明为它所属的位置,因此函数的用户不必为它们存储状态:

function makeScanValidator(display) { // any other configuration
    var validations = [];
    // returns closure
    return function scanValidation(scanval) { // take it as an argument
        if (validations.includes(scanval)) {
            display(/* error */);
        } else {
            var validarr = validations.concat([scanval]);
            var myData = JSON.stringify({"name": "user1", "validations": validarr});
            apiCall(myData, 'scanValidation', function(decoded) {
                if (decoded.Status!="ERROR") {
                    validations = validarr;
                } else {
                    display(/* error */);
                }
            });
        }
    }

$(document).ready(function() {
    var validate = makeScanValidator(function display() { … });
    $('#inp').keypress(function(e){
        if(e.which == 13){
            e.preventDefault();
            validate(this.value);
        }
    });
});