0

我有一个变量,我想在另一个函数中使用,但不知道如何正确调用它。外部 JS 文件:

<script>
function search ()
{
var subscriptionId = "";

if (document.getElementById('deleteyes').checked)
 {
  alert(subscriptionId);
 }
}
<script>

HTML 文件:

<script>
$(document).ready(function() { 
    $.getJSON(ravenUrl + '/indexes/dynamic/Subscriptions?query=Email%253A' + email, function(json) {
        subscriptions = json.Results;
        var html = '';
        for (var i in json.Results) {
            html += '<option value="' + i + '">Edit "' + json.Results[i].Name + '"</option>';
        }
        $('#subscriptionSelector').append(html);
    });

    $("#subscriptionSelector").change(function() { //alert('#forumSelector');
    var subscriptionIndex = $(this).val();
    var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
    alert(subscriptionId);
    });
}
</script>



    <body>
<script type="text/javascript" src="externaljsfile.js"></script>
                                                        <p>create / edit subscription</p>
                                                            <select id="subscriptionSelector"><option selected="true" value="-1">Create new</option></select>
                                                <p>delete subscription</p>
     <div style="margin-left:35px;margin-top:6px;float:left;"><input type="radio" name="delete" id="deleteno" class="div1" checked />no</div>
    <div style="margin-left:35px;margin-top:6px;float:left;"><input type="radio" name="delete" id="deleteyes" class="div1"/>yes</div>

        </body>

在 html 文件中的 javascript 中正确生成了警报(订阅 ID),但外部 js 文件中的警报显然没有生成正确的订阅 ID。

我意识到这可能是一个非常简单的问题,但我的技能水平甚至无法执行搜索以找到与 javascript 相关的问题的答案,所以请耐心等待。先感谢您。

4

7 回答 7

1

将变量声明放在函数之外var subscriptionId = "";(全局变量)

然后您可以从任何其他功能访问它。

于 2012-10-16T13:32:47.957 回答
1

最简单的解决方案是subscriptionId在全局范围内声明。

这意味着“在”之外search()

var subscriptionId = "";

function search ()
{

if (document.getElementById('deleteyes').checked)
 {
  alert(subscriptionId);
 }
}
subscriptionId = "what?";
search();
于 2012-10-16T13:31:56.877 回答
1

这里的问题是范围之一,您(正确地)subsriptionId在函数范围中声明。但是,一旦该函数返回,该变量就会被 GC(垃圾收集)。

正如@GungFoo 所说,起初,您可能会认为全局声明变量(因此永远不会有 var GC'ed)会解决问题,而且一开始会。但是很快你就会污染全局范围,以至于你会遇到问题。例如,您可能会无意中更改另一个函数所依赖的变量的值。只需在谷歌上搜索几篇关于此问题的文章,您很快就会发现为什么这不是一个好主意。

几种选择:

假设“其他功能”是在全局范围内定义的,您可以为其分配一个属性:

function()
{//this declares and assigns subscriptionId
    var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
    theOtherFunction.subscId = subscriptionId;//assign property
    alert(subscriptionId);
}
//the other one
function theOtherFunction()
{
    alert(theOtherFunction.subscId);//will alert the correct value
}

更简单的是,只需使用 jQuery:

function theOtherFunction()
{
    var id = subscriptions[$("#subscriptionSelector").val()]["@metadata"]["@id"].substring(7);
    alert(id);//will work, too
}

后者的缺点是每次调用都会扫描 DOM,以找到特定的元素 ( $("#subscriptionSelector"))。要解决这个问题,您可以使用闭包:

var theOtherFunction = (function(selector)//takes DOM element as argument
{
    return function()//this is the actual function
    {//thanks to closures, selector will not be GC'ed
        var id = subscriptions[selector.val()]["@metadata"]["@id"].substring(7);
        alert(id);//works like a charm
    };
})($("#subscriptionSelector"))//pass DOM element as argument

最后一种方法起初可能看起来有点令人生畏,但花一些时间阅读 IIFE、闭包和范围魔法。它是 JS 最好的特性之一,非常强大,掌握了基本概念也不会那么难!

于 2012-10-16T13:46:32.697 回答
0

最好的解决方案是将subscriptionIDover 传递给search函数。如果这是不可能的,您将不得不将其推入更高的范围(例如全局范围)。

要使其全球可用,请更改此:

var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);

对此:

window.subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);

然后它也将在外部 javascript 中可用。

于 2012-10-16T13:33:53.273 回答
0

subscriptionId 仅在函数范围内可用

在 html 文件中移动var subscriptionId = "";前面的 $(document)

于 2012-10-16T13:33:56.003 回答
0

代替

<script>
function search ()
{
var subscriptionId = "";

和:

<script>
var subscriptionId = "";
function search ()
{
于 2012-10-16T13:33:58.420 回答
0

做 :

$("#subscriptionSelector").on('change', function() { //alert('#forumSelector');
    var subscriptionIndex = this.value;
    var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
    $(this).data('checked', subscriptionId); //store as data
    alert(subscriptionId);
});

接着 :

function search () {
    var subscriptionId = $("#subscriptionSelector").data('checked');
    if ($('#deleteyes').prop('checked')) {
        alert(subscriptionId);
    }
}

这样,数据将存储在元素上。

更多关于data()jQuery 的信息:http: //api.jquery.com/jQuery.data/

于 2012-10-16T13:35:12.257 回答