为什么不能将函数内部的值赋给外部(全局)声明的变量?

时间:2012-02-22 15:19:01

标签: javascript jquery html variables scope

我不知道为什么我不能将.hover函数捕获的值赋给全局声明的变量。

这是我的jQuery代码:

jQuery(function($){

  var receipt;

  $("#cartItems tr.cItem").hover(

        function()
        {
            $(this).addClass("highlight");
            receipt = $(this).next().children().text();
            console.log(receipt);
        },
        function()
        {
            $(this).removeClass("highlight");
        }
    );

    console.log(receipt);

  });

这是我的HTML:

<table id="cartItems">
  <tr>
     <td>Lp.</td><td>z:</td><td>na:</td><td>cena netto:</td>
  </tr>
  <tr class="cItem">
      <td>ru</td><td>pl</td><td>16.00</td>
  </tr>
  <tr>
      <td colspan="4">some simple text that should be assigned </td>
  </tr>
 </table>

第一个console.log(receipt)(内部.hover函数)工作正常,输出some simple text..,第二个输出没有。

请帮忙。

谢谢大家的快速回复。你们都对.hover功能完全正确。我的错。但现在我有另一个相关的问题。 我需要这个值将它传递给这样调用的“qTip”插件:

$("#cartItems tr.cItem").qtip(
{
    content: receipt,
    show: 'mouseover',
    hide: 'mouseout'
 });

我应该以某种方式合并这些电话吗?

5 个答案:

答案 0 :(得分:5)

对console.log的“第二次”调用实际上是第一次(它在文档准备就绪时发生),此时你的var没有被定义

答案 1 :(得分:3)

只有在调用悬停功能后,该值才会分配给receipt。您在#cartItems tr.cItem被悬停之前登录到控制台。

答案 2 :(得分:1)

正如其他人所提到的那样,您目前放置了console.log(receipt)receipt尚未初始化。

如果您想将其更改为更有意义的内容,您可以:

  1. 将变量声明移到on load function
  2. 之外
  3. 在自己的函数中调用console.log(收据),您可以在加载函数后附加到点击事件或任何其他操作
  4. var receipt;
    
    jQuery(function ($) {
        $("#cartItems tr.cItem").hover(
    
        function () {
            $(this).addClass("highlight");
            receipt = $(this).next().children().text();
            console.log(receipt);
        }, function () {
            $(this).removeClass("highlight");
        });
    
    });
    
    function printConsole() {
        console.log(receipt);
    }
    

    这是一个jsfiddle演示,显示了这一点。

    注意当它第一次输出值为undefined时,因为当页面首次加载时,悬停事件未被触发,因此变量未初始化。在您悬停并单击链接后,它现在有一个值。

答案 3 :(得分:1)

第二个console.log就其在代码中的布局方式而言,在悬停之前发生,因此变量未定义。在您悬停后,它会正确记录下一个tr的子项的文本。这是一个jsfiddle,你的代码工作正常。 http://jsfiddle.net/63xKR/

答案 4 :(得分:1)

只有在实际悬停在元素上方时才会执行hover()函数。所以你写的基本上是:

var receipt = null;
var documentReady = someFunctionToBeExecutedLater(){ doesnt matter whats in here };
console.log(receipt);

如你所见,实际上没有人调用函数(documentReady()),因此收据将保持为空。