从嵌套匿名函数中获取值

时间:2012-01-06 13:50:00

标签: javascript jquery function

我有一个项目列表,其中包含我尝试在点击事件中返回的不同数据值。我似乎无法将click事件中的值传递给父函数。我可能只是做错了。我只需要每个click事件的数据值来替换我的systemName变量的值。有人可以帮助我吗?

function getSystemName(){
var systemName = '';
$('.pulldown li').bind('click', function(){
    var systemName = '';
    var systemName = $(this).find('a').data('value');
    console.log(systemName);
});
return systemName;
}

//编辑:我应该解释一下,我正试图从click事件中获取该值,以通过jquery .load更新页面上的内容,所以也许就像下面提到的那样....我不是这样做的因为我可以在点击时正确记录systemName但似乎不更新页面内容。这是整个代码块。

$.ajaxSetup ({  
    cache: false  
});  
var ajax_load = "<img src='.../images/130.gif' alt='loading...' align='middle' />";
var loadUrl = ".../content.php";  

var getSystemName = (function(){
var systemName = '';
$('.pulldown li').bind('click', function(){
   systemName = $(this).find('a').data('value');
   console.log(systemName);
});
return function() { return systemName };
})();

$("#results")  
    .html(ajax_load)  
    .load(loadUrl, "ki_systems=" +getSystemName());

6 个答案:

答案 0 :(得分:2)

在问题的代码中,每次调用getSystemName()时,它都会再次绑定一个点击处理程序 (导致多个点击处理程序),然后返回本地{{1}变量总是空白的。

如果您说每次致电systemName,您希望它返回与最近点击的getSystemName()元素相关联的系统名称,那么您可以将li变量声明为一个全局变量并绑定事件处理程序(一次) systemName之外:

getSystemName()

但是这使得函数变得多余:你可以直接反映全局变量。

另一方面,你可以只声明函数并使用闭包来避免需要全局变量,如下所示:

var systemName = '';

$('.pulldown li').bind('click', function(){
   systemName = $(this).find('a').data('value');
   console.log(systemName);
});

function getSystemName() {
   return systemName;
}

对于那些没有经验的人来说,最后一块可能会让人感到困惑。它将var getSystemName = (function(){ var systemName = ''; $('.pulldown li').bind('click', function(){ systemName = $(this).find('a').data('value'); console.log(systemName); }); return function() { return systemName }; })(); // if no items have been clicked yet it will return an empty string by default console.log( getSystemName() ); // "" // click on an item with name "red" console.log( getSystemName() ); // "red" // click on an item with name "green" console.log( getSystemName() ); // "green" 设置为从立即执行的匿名函数表达式返回的任何内容(注意结尾处的额外空括号)。返回的是一个简单的函数,当被调用时,它将返回getSystemName,它在外部作用域中声明。点击处理程序也会更新同一个systemName。因此,当您实际调用systemName时,您正在调用getSystemName()语句中的小单行函数。

答案 1 :(得分:1)

我认为这里的问题是你缺少同步和异步编程 - 你可能想要在getSystemName()函数上进行回调。我希望你所采取的方法在架构方面存在问题。

但是,如果我使用你的风格写下它,那就是它的样子:

function getSystemName(callback) {
    $('.pulldown li').bind('click', function(){
        console.log(systemName);
        callback( $(this).find('a').data('value') );
    });
}

所以不是这种代码:

console.log("System Name: ", getSystemName())

你会:

getSystemName( function (name) { console.log("System Name: ", name); } );

答案 2 :(得分:0)

你不能。

查看代码。

  1. systemName设置为空字符串
  2. 点击列表项systemName设置为其他
  3. 返回systemName
  4. 您无法让 3 等待 2 。您需要对点击处理程序中的数据执行某些操作,而不是尝试将其返回。

答案 3 :(得分:0)

从第二个和第三个定义中删除var。如果在变量名之前使用var,则将创建一个新的本地实例。

 systemName = '';
 systemName = $(this).find('a').data('value');
console.log(systemName);

答案 4 :(得分:0)

好吧,我想您正在尝试设置一个值以查看哪个节点已被单击,因此您需要更改systemName变量的范围。把它移出来它就像全球一样,如下:

var systemName = '';
$('.pulldown li').bind('click', function(){
    systemName = $(this).find('a').data('value');
    console.log(systemName);
});

答案 5 :(得分:0)

考虑到这一点,在第二行,你只是将一个回调函数绑定到click事件,而不是执行该函数内的代码。