【问题标题】:Scope issue (javascript)范围问题(javascript)
【发布时间】:2013-09-22 02:10:41
【问题描述】:

我正在使用PHPAjax/JSONMysql 运行javascript 变量。我原来的问题可以在这里找到:from mysql to javascript variable。基本上,我现在遇到了在整个脚本的其余部分中识别变量的问题。在我的最后一个问题上,您会看到两个变量来自:

var tag_name = 'example';
var client_id = '123456789';

现在使用(谢谢@Richard Rodriguez):

$.ajax({
   url: 'call.php',
   dataType: 'json'
}).done(
   function(data){
     var tag_name = data[0];
     var client_id = data[1];
   }
);

我相信问题可能只是javascript function conflict?这是我试图从 github 修改的脚本的链接:https://raw.github.com/ryancw/instagram-scroll/master/instagram-scroll.js。我希望看到原始文件可以帮助诊断导致问题的原因?我研究了最后 2 个小时,但没有运气。任何关于 javascript 函数冲突(如果这是问题的话)的建议甚至是优秀文章的链接都会有很大帮助。

编辑(完整代码):

var tag_name = null;
var client_id = null;
var thumb_dimension = null;
var div_to_add_pics = null;
var include_caption = null;
var include_username = null;
var url = null;

function processData() {
   console.log(tag_name);
   console.log(thumb_dimension);  
    console.log(div_to_add_pics);
    console.log(include_caption);
   console.log(include_username);
   console.log(url);
}

$.ajax({
   url: 'call.php',
   dataType: 'json'
}).done(
   function(data){
     tag_name = data[0];
     client_id = data[1];
     thumb_dimension = 220;
    div_to_add_pics = '#img';
    include_caption = false;
    include_username = false;
    url = 'https://api.instagram.com/v1/tags/'+tag_name+'/media/recent?client_id='+client_id;
     processData();
   }
);

【问题讨论】:

    标签: javascript ajax


    【解决方案1】:

    您的问题是范围而不是功能冲突。声明变量的方式它们仅在本地范围内可见,您要么需要在那里使用它们,要么将它们传递给可以使用它们的另一个函数,或者(在污染全局范围时)全局声明它们并删除 var 关键字在 .done 回调中

    在本地使用它们

    $.ajax({
       url: 'call.php',
       dataType: 'json'
    }).done(
       function(data){
         var tag_name = data[0];
         var client_id = data[1];
    
         var clienttag = client_id+tag_name;
         //blah blah blah
       }
    );
    

    将它们传递给另一个函数

    function processData(tag_name,client_id) {
       console.log(tag_name);
       console.log(client_id);  
    }
    
    $.ajax({
       url: 'call.php',
       dataType: 'json'
    }).done(
       function(data){
         var tag_name = data[0];
         var client_id = data[1];
         processData(tag_name,client_id);
       }
    );
    

    全局声明(这是最不理想的,因为它会污染全局空间)

    var tag_name = null;
    var client_id = null;
    
    function processData() {
       console.log(tag_name);
       console.log(client_id);  
    }
    
    $.ajax({
       url: 'call.php',
       dataType: 'json'
    }).done(
       function(data){
         tag_name = data[0];
         client_id = data[1];
         processData();
       }
    );
    

    【讨论】:

    • 公平警告,如果您执行选项 3(全局),人们将不再想成为您的朋友。只是说...
    • @Patrick 非常感谢,这些信息确实帮助我更好地理解了这个问题。考虑到我正在尝试使其与 github 上的脚本(已链接)一起使用,我想全局声明它们,因为变量在整个脚本、其他变量、ProcessData(response) 和其他函数中使用。尝试使用所有三种方法都没有运气。
    • 如果你需要它们全局然后第三个选项将工作,如果它没有那么你没有正确复制它。这 2 个变量应该在全局空间中声明(在任何函数之外)
    • @PatrickEvans 第三个选项应该起作用,我无法诊断为什么它不起作用,你能检查我链接的 github 原始文件吗?
    • 有一个名为 url 的全局变量从这两个变量构建一个 url,除非您在 ajax done 回调函数中修改了 url,然后 loadResults 函数使用全局 url 变量使用了无效的 url。这是我唯一能看到的,您应该编辑您的问题以显示您如何修改该脚本,以便我们可以看到您如何修改它。
    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多