我试图避免在我的代码中使用全局变量,所以我试图通过在$(document).ready
内声明它们并将它们作为参数传递给{{1更新它们,然后从这些函数返回更新的值来操作$(document).ready
内的变量。
另一种方法是使用$(document).ready
输入字段来存储变量,但我也听说这是不好的做法。
我想知道我是否应该只使用全局变量,按照我目前的方式进行操作,还是使用隐藏的输入字段?
以下是我正在努力完成的一个简短示例。变量验证是我希望能够使用和更新的变量。
hidden
答案 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);
}
});
});