javascript中的范围问题

时间:2015-03-12 18:52:22

标签: javascript scope

我正在尝试获取网址列表,并在链接到的网页中迭代搜索关键字。但是,当我运行程序时,它只返回列表的最后一个元素,其页面具有关键字的链接数。当我尝试使用

运行它时
http://www.google.com
http://www.yahoo.com
http://www.bing.com

并搜索

google

在其中,它返回

http://www.bing.com
http://www.bing.com

为什么在将它设置为for循环中的每个元素时,它会采用列表的最后一个元素?以下是我的代码。

<html>
<head>
<title></title>
</head>
<body>
<div>
    Links: <textarea rows="4" cols="50"></textarea><br>
    Search term: <input type="text" name="search" id="search"><br>
    <button>search</button>
</div>
<div id="result">
    <ul>
    </ul>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript">
function searchLinks() {
    var links = $('textarea').val();
    links = links.replace(/(\r\n|\n|\r)/gm," ");
    links = links.replace("  "," ").split(" ");
    var searchTerm = $("#search").val();
    for(var i=0;i<links.length;i++) {
        var link = links[i];
        $.get(link).success(function(data){
            if (data.indexOf(searchTerm) > -1) {
                $( "#result ul" ).append("<li>"+link+"</li>");
            }
        });
    }
}
var search = $("button");
search.click(function() {searchLinks()});
</script>
</body>
</html>

1 个答案:

答案 0 :(得分:3)

循环遍历异步调用时需要使用闭包:

for(var i=0;i<links.length;i++) {
    (function(link) {
        $.get(link).success(function(data){
            if (data.indexOf(searchTerm) > -1) {
                $( "#result ul" ).append("<li>"+link+"</li>");
            }
        });
    })(links[i])
}