【问题标题】:How to get a value out of a JavaScript function?如何从 JavaScript 函数中获取值?
【发布时间】:2011-09-10 03:57:01
【问题描述】:

我需要从 JavaScript 函数中获取行号:

function cap_check(){
    var row;

    $('td').change(function(){ 
        row = $(this).parent().parent().children().index($(this).parent());  
        alert(row);
    }); 

    alert(row);
}

在函数内,row 被正确警告。函数外是undefined。

【问题讨论】:

  • 看看这篇文章。这是相同的。 stackoverflow.com/questions/2611980/…
  • 能否请您包含此代码附带的 html
  • @JAiro:不,不一样。
  • 你期待什么?当函数cap_check被调用时,并不意味着change事件处理函数被立即触发。意思是,row = $(this).parent().... 将在 cap_check 已经返回后的一段时间后执行。

标签: javascript jquery


【解决方案1】:

$('td').change(function(){ })

Change 允许您传递一个回调,该回调将在值更改时运行。

所以只是通过附加回调它不会运行它。它只会在值更改时运行。由于函数的其余部分在值更改之前运行,row 的值未定义。

只需将脚本的其余部分放在回调中

【讨论】:

  • 他已经有了回调,他只需要将函数的其余部分保持在其范围内
  • 感谢大家的快速响应。我试过了,但它会影响其余代码中的其他一些 onChange 触发。这就是为什么我需要从 jq 函数中取出值。谢谢
【解决方案2】:

你不应该将函数的其余部分保留在更改函数中吗?

function cap_check(){
     var row;
             //-----------------------Jquery current table row  
     $('td').change(function(){ 
           row = $(this).parent().parent().children().index($(this).parent());  

           //rest of script here
         }); 

 }

【讨论】:

    【解决方案3】:

    函数内部的row 与外部行的范围完全不同。

    所以当你在change() 函数之外时,row 是未定义的,但是一旦change 被触发,row 就会得到一个值

    function cap_check(){
        var row;
    
        $('td').change(function(){ 
            row = $(this).parent().parent().children().index($(this).parent());  
            alert(row); //only has a value on change
        }); 
    
        alert(row); //undefined
    }
    

    【讨论】:

    • @Raynos,你是什么意思?
    • 这是一个过于笼统的概括。 JavaScript 不是异步的。只有事件处理程序(某种)和 Ajax。将函数作为参数传递并不意味着函数何时执行。
    • 如果错了,您是否还有其他替代想法来完成这项工作以使该脚本发挥作用。
    • 是的,你是对的 Naal :)。我的意思是有没有其他方法可以完成工作。我的意思是让下面的代码与 jq 更改函数以及行值分开。
    • @Ceylo:你还没有向我们解释cap_check 应该做什么。只有知道您要解决的问题,我们才能为您提供帮助。
    【解决方案4】:

    除了undefined 之外,拨打cap_check 不会提醒任何其他人。函数不是静态对象。当您调用一个函数时,它会在内部堆栈上创建一个新实例。 row 将被初始化为 undefined 并且新的单击处理程序将绑定到 td 元素(也可能没有用 - 因为每次调用 cap_check 时都会绑定另一个重复的事件处理程序)。

    你很可能想要这样的东西:

    var cap_check=(function() {
        var row;
        $('td').change(function(){ 
            row = $(this).parent().parent().children().index($(this).parent());  
            alert(row);
        }); 
        return function() {
           alert(row);
        };
    }());
    

    这是一个自执行函数。当脚本运行时,“return”之前的函数部分会立即执行,创建一次事件绑定,并返回一个引用原始函数实例的函数。这将创建一个 闭包,这意味着该函数维护对其父对象的引用(在本例中为 row 变量)。因此,您的事件处理程序和返回为 cap_check 的函数现在将始终引用 row 的同一实例。

    所以 - 现在任何调用 cap_check 的代码将始终返回分配给 change 事件结果的相同值。

    小提琴:

    http://jsfiddle.net/RagUe/5/

    (请注意,我将事件更改为“单击”而不是“更改”以使其易于测试)。

    【讨论】:

    • 我无法理解它的工作原理和原因 - 是否有一些阅读材料或 YouTube 观看材料可以让我更好地理解这里的工作机制或概念?我不明白当你将函数和其他东西包装在括号中时会发生什么(这不是一个元组吗?),或者当函数返回一个函数时会发生什么,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2011-04-04
    • 2012-04-21
    • 2016-01-07
    • 2011-03-31
    相关资源
    最近更新 更多