【问题标题】:Javascript variable scope issue - probably simpleJavascript变量范围问题 - 可能很简单
【发布时间】:2014-10-05 01:40:39
【问题描述】:

我正在寻找此问题的快速解决方案:

function remove() {
    var clickedbtn;
    $("button[role=remove]").click(function() {
        clickedbtn = this.id;
        alert(clickedbtn); // works, assigns correct value
    });
    alert(clickedbtn); // undefined -- why?
}

clicked 变量用 var 声明并分配了一个值,但该值在 click() 函数之外不是持久的。任何帮助表示赞赏。

【问题讨论】:

  • 为什么要在点击发生之前找出用户点击了哪个按钮?
  • 如果分配给clickedbtn(而不是clicked),它如何可能工作?现在,即使修复它以使其显示为clicked = this.id,它仍然会显示“未定义”,因为警报发生在用户有机会点击按钮之前。
  • 你的函数不正确,clicked没有赋值。
  • 只是一个提示:不要只是简单或标题中的帮助。它用不必要的字眼使标题变得臃肿,并且不利于人们之后的搜索。

标签: javascript jquery variables scope


【解决方案1】:

当您尝试在外部函数中使用变量时,click() 尚未运行,因为用户尚未点击。

你无法预测未来的价值。


与该问题不同,您的变量名称不匹配。 (clicked 不是clickedbtn

【讨论】:

  • 他是对的。这就是我在更新中提出的观点。 clicked 永远不会被分配任何东西。 OP 只是在提醒 id。没有为点击分配任何东西。
【解决方案2】:

您永远不会为clicked 赋值!

所以

function remove() {
    var clicked;
    $("button[role=remove]").click(function() {
        clickedbtn = this.id;
        alert(clickedbtn);
        clicked = true; // or if you want clicked set to the id of the button then clicked = this.id;
    });
    alert(clicked);
}

【讨论】:

  • 那不会有任何区别。
  • @SLaks 你是对的。我看到他从来没有分配任何东西来点击并更新我的答案。
【解决方案3】:

这个问题与作用域无关 - 它与 when 代码运行有关。异步代码是异步的,这个问题和incorrectly assigning a variable in an AJAX call一样。

采用以下代码(我已更正了对不存在的“clickedbtn”变量的赋值),它指示 何时 事情将按照 cmets 中的数字运行:

# 1
var clicked = "initial value";
# 2
$("button[role=remove]").click(function() {
    # At some point -AFTER- 3
    clicked = this.id;
    alert(clicked);
});
# 3
alert(clicked);

这是因为单击回调仅在用户单击按钮后调用(阅读:“在将来的某个时间点”),而添加回调处理程序的.click 函数返回immediately 并且以下显示警报的代码被执行 immediately 这发生在 before 变量已被分配了可能被点击的元素的 ID 未来。

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2010-11-08
    相关资源
    最近更新 更多