Javascript JS:为什么我不能在嵌套函数中调用var变量?
我有一个stars评级系统,我想捕获用户选择的值,然后通过AJAX将其发送到服务器进行进一步处理 我无法提醒使用此代码选择的星号的值:Javascript JS:为什么我不能在嵌套函数中调用var变量?,javascript,jquery,Javascript,Jquery,我有一个stars评级系统,我想捕获用户选择的值,然后通过AJAX将其发送到服务器进行进一步处理 我无法提醒使用此代码选择的星号的值: $("fieldset input").click(function () { var radios = document.getElementsByName('rating'); for (var i = 0, length = radios.length; i < length; i++
$("fieldset input").click(function () {
var radios = document.getElementsByName('rating');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
// do whatever you want with the checked radio
var review_stars = radios[i].value;
alert(review_stars);
// only one radio can be logically checked, don't check the rest
break;
}
}
});
$(“字段集输入”)。单击(函数(){
var radios=document.getElementsByName(“评级”);
对于(变量i=0,长度=radios.length;i
但是如前所述,我需要将值保存到一个变量中,然后通过AJAX将其发送到后端。因此,我将上述代码插入到另一个将执行AJAX部分的函数中,如下所示:
$("#send_review").click(function (e) {
$("fieldset input").click(function () {
var radios = document.getElementsByName('rating');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
// do whatever you want with the checked radio
var review_stars = radios[i].value;
// only one radio can be logically checked, don't check the rest
break;
}
}
});
alert(review_stars);
});
$(“#发送#u审阅”)。单击(功能(e){
$(“字段集输入”)。单击(函数(){
var radios=document.getElementsByName(“评级”);
对于(变量i=0,长度=radios.length;i
但是现在,我无法访问review\u stars变量。我不能提醒它的价值。为什么?
更新1
已使用Trincot的答案更新,但未提醒值:
因为用
var
声明的变量具有功能范围。您应该在全局范围内声明review\u stars
var review_stars;
$("#send_review").click(function (e) {
$("fieldset input").click(function () {
var radios = document.getElementsByName('rating');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
// do whatever you want with the checked radio
review_stars = radios[i].value;
// only one radio can be logically checked, don't check the rest
break;
}
}
});
var审查;
$(“#发送#U审阅”)。单击(功能(e){
$(“字段集输入”)。单击(函数(){
var radios=document.getElementsByName(“评级”);
对于(变量i=0,长度=radios.length;i
JavaScript中的Var变量具有函数作用域
review_stars作用域设置为函数“fieldset input”点击处理程序内
您正在引用其范围之外的review_stars,正如其他人提到的,您有一个范围问题。您只需要在这些函数之外定义变量
var review_stars;
$("#send_review").click(function (e) {
$("fieldset input").click(function () {
var radios = document.getElementsByName('rating');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
// do whatever you want with the checked radio
review_stars = radios[i].value;
// only one radio can be logically checked, don't check the rest
break;
}
}
});
alert(review_stars);
});
var审查;
$(“#发送#U审阅”)。单击(功能(e){
$(“字段集输入”)。单击(函数(){
var radios=document.getElementsByName(“评级”);
对于(变量i=0,长度=radios.length;i
在另一个单击处理程序中包含一个单击处理程序通常表示设计中存在错误
想一想:为什么在用户点击“发送”按钮之前,您需要知道选中了哪个复选框?也许您有原因,但您提供的代码没有显示这样的原因
简言之,您只需要在准备Ajax调用时执行此任务,而不是在单击复选框时。删除此行和相应的右括号:
$("fieldset input").click(function () {
…现在,您将在需要变量的地方拥有该变量:一个var
声明在变量出现的函数中为该变量提供一个作用域:
$("#send_review").click(function (e) {
var radios = document.getElementsByName('rating');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
// do whatever you want with the checked radio
var review_stars = radios[i].value;
// only one radio can be logically checked, don't check the rest
break;
}
}
alert(review_stars);
});
$(“#发送#u审阅”)。单击(功能(e){
var radios=document.getElementsByName(“评级”);
对于(变量i=0,长度=radios.length;i
当然,你也可以用一个全局变量来解决这个问题,但这并不是最好的做法,至少在这种情况下不是
通过创建一个单独的函数来检索复选框,您可以使事情变得更简单:
function getReviewStars() {
var radios = document.getElementsByName('rating');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
// do whatever you want with the checked radio
var review_stars = radios[i].value;
// only one radio can be logically checked, don't check the rest
break;
}
}
return review_stars; // <---- return it!
}
// And now you can call it whenever you want it:
$("#send_review").click(function () {
alert(getReviewStars());
});
$("fieldset input").click(function () {
alert(getReviewStars());
});
函数getReviewStars(){
var radios=document.getElementsByName(“评级”);
对于(变量i=0,长度=radios.length;igetReviewStars()
中返回值,而是从这里发出警报。我的回答中缺少)
。打开控制台时,可以看到er