我有一个变量,我想在另一个函数中使用,但不知道如何正确调用它。 外部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>
警报(subscriptionId)在html文件的javascript中正确生成,但外部js文件中的警报显然没有生成正确的subscriptionId。
我意识到这可能是一个非常简单的问题,但我处于技能水平,我甚至无法执行搜索以找到与javascript相关的问题的答案,所以请耐心等待。提前谢谢。
答案 0 :(得分:1)
最简单的解决方案是在全局范围内声明subscriptionId
。
这意味着“在search()
之外”:
var subscriptionId = "";
function search ()
{
if (document.getElementById('deleteyes').checked)
{
alert(subscriptionId);
}
}
subscriptionId = "what?";
search();
答案 1 :(得分:1)
将变量声明放在函数var subscriptionId = "";
(全局变量)
然后你可以从任何其他功能访问它。
答案 2 :(得分:1)
这里的问题是范围之一,您(正确地)在函数范围内声明subsriptionId
。但是,只要该函数返回,该变量就是GC( Garbage Collected )。
正如@GungFoo所说,起初,你可能会认为全局声明变量(因此永远不会使用var GC)会解决问题,而且最初会这样做。但很快你就会污染全球范围,以至于你会遇到问题。例如,您可能会无意中更改另一个函数所依赖的变量的值。只要谷歌几篇关于此事的文章,你很快就会发现为什么这不是一个好主意。
一些替代方案:
假设“其他功能”在全局范围内定义,您可以为其指定一个属性:
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的最佳功能之一,功能非常强大,一旦掌握了基本概念,就不那么难了!
答案 3 :(得分:0)
最佳解决方案是将subscriptionID
传递给search
函数。如果无法做到这一点,则必须将其推向更高的范围(例如全局范围)。
要使其全局可用,请更改:
var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
对此:
window.subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
然后它也可以在外部JavaScript中使用。
答案 4 :(得分:0)
subscriptionId仅在函数范围内可用
在html文件中移动var subscriptionId = "";
bevore $(文档)
答案 5 :(得分:0)
替换
<script>
function search ()
{
var subscriptionId = "";
使用:
<script>
var subscriptionId = "";
function search ()
{
答案 6 :(得分: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);
}
}
这样数据就会存储在元素上。
有关jQuery的data()
的更多信息:http://api.jquery.com/jQuery.data/