函数外部的Javascript闭包变量访问

函数外部的Javascript闭包变量访问,javascript,jquery,variables,closures,Javascript,Jquery,Variables,Closures,我想在img#play的函数中访问下面的变量linky。然而,它只接受最后一个已知的linky值,我理解这是由于一个叫做Javascript闭包的东西。谷歌搜索和尝试许多不同的东西,比如在img中返回linky,播放点击功能似乎不起作用。我还被告知,variablesong也会遇到同样的问题。有没有人对如何让img的点击功能为每个单独的链接而不是最后一个链接工作有什么想法 function doSearch() { var searchTerm = document.getElem

我想在
img#play
的函数中访问下面的变量
linky
。然而,它只接受最后一个已知的linky值,我理解这是由于一个叫做Javascript闭包的东西。谷歌搜索和尝试许多不同的东西,比如在img中返回linky,播放点击功能似乎不起作用。我还被告知,variable
song
也会遇到同样的问题。有没有人对如何让img的点击功能为每个单独的链接而不是最后一个链接工作有什么想法

  function doSearch() {

    var searchTerm = document.getElementById('search').value;

    // Search soundcloud for artists
    SC.get('/tracks', { q: searchTerm}, function(tracks) {
      for(track in tracks) {

        console.log(tracks[track]);

        var img = document.createElement('img');
        img.setAttribute("src", (tracks[track]["artwork_url"]));
        var title = tracks[track].title.replace("'", "\\\'").replace("\"", "\\\"");

        var song = document.createElement('div');

        var linky = document.createElement('a');
        linky.setAttribute("href", (tracks[track].permalink_url));

        img.setAttribute("onclick", "showTrackInfo('" + title + "\\n" + "\\n" + tracks[track].label_name + "\\n\\n" + "(click to close)" + "')"); 



        if (tracks[track]["artwork_url"] == null) {
          console.log(""); } 
        else { 

          var Catalog = document.getElementById('catalog');
          Catalog.appendChild(img);

          $('div#catalog').append('<img src="http://i.imgur.com/rGdvfl7.png" id="play">');


          $('img#play').click(function() {

            return this.linky;


          $.get(
            'http://soundcloud.com/oembed?' + 
            'url=' + linky + 
            '&format=json&maxheight=296'
            )

          .done(function (response) {
            song.innerHTML = response.html;
            document.getElementById("soundiframe").appendChild(song);

          });
          });
        }


      }
    });
  };
函数doSearch(){
var searchTerm=document.getElementById('search').value;
//搜索soundcloud寻找艺术家
SC.get('/tracks',{q:searchTerm},函数(tracks){
用于(轨道中的轨道){
console.log(tracks[track]);
var img=document.createElement('img');
img.setAttribute(“src”,(tracks[track][“artwork_url]”);
var title=tracks[track].title.replace(“'”,“\\\”).replace(“\”,“\\\”);
var song=document.createElement('div');
var linky=document.createElement('a');
setAttribute(“href”,(tracks[track].permalink_url));
img.setAttribute(“onclick”、“showTrackInfo”(“+title+”\\n“+”\\n“+tracks[track]。label_name+”\\n\\n“+”“(单击关闭)”+”);
如果(曲目[track][“artwork_url”]==null){
console.log(“”;}
否则{
var Catalog=document.getElementById('Catalog');
目录子目录(img);
$('div#catalog')。追加('');
$('img#play')。单击(函数(){
返回此.linky;
美元(
'http://soundcloud.com/oembed?' + 
“url=”+linky+
“&format=json&maxheight=296”
)
.完成(功能(响应){
song.innerHTML=response.html;
document.getElementById(“soundiframe”).appendChild(歌曲);
});
});
}
}
});
};

我需要上面代码中的所有变量。。。如果有人知道该怎么做,我们将不胜感激

您可以创建另一个闭包:

(function(linky, song) {
  $('img#play').click(function() {
     ...
}(linky, song));

这将在创建闭包时保留linky的值。

看起来问题更多地与异步行为有关。循环作用域问题常见<代码>歌曲在$.get()中,它将引用上次创建的歌曲,如果它曾经到达$.get(),因为您返回的是之前的值。非常奇怪的代码结构…使用“returnthis.linky;”您希望得到什么。我尝试了这个:并在第2行和第10行添加了代码。然而,我仍然只得到最后一首歌,不是每一首。我做错什么了吗?@jenno你换了第1行和第2Ah行。起初我是这样试的,但当它不起作用时,我把它换成了现在的样子。两者都不起作用。。。“我错过了什么吗?”詹诺:“什么东西不起作用?”?我刚刚看到你们也想用这种方式来唱这首歌。我已经更新了我的答案。您不必在
done
处理程序中使用
(函数(歌曲){…}(歌曲))