Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:为什么我不能在嵌套函数中调用var变量?_Javascript_Jquery - Fatal编程技术网

Javascript JS:为什么我不能在嵌套函数中调用var变量?

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++

我有一个stars评级系统,我想捕获用户选择的值,然后通过AJAX将其发送到服务器进行进一步处理

我无法提醒使用此代码选择的星号的值:

$("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;ireturn review_stars;//两个问题可能重复。#1)它的作用域为低。#2)它位于事件处理程序中,在单击发送评论时不会触发该事件处理程序。#3问题)您正在另一个单击绑定中创建单击绑定。**不要这样做**™这不会通过以下警报解决嵌套绑定问题。请参阅我的更新1。它不会警报该值,除非在
getReviewStars()
中返回值,而是从这里发出警报。我的回答中缺少
。打开控制台时,可以看到er