2014-04-28 32 views
2

我有以下代碼:的Javascript範圍與引導

jsFiddle

<a id="test">Click me</a> 
<a id="field2" style="border: 1px solid green;">0</a> 


var i = 0; 
$('a#test').click(function() { 
    i += 1; 
    var a = i; 

    $('a#test').popover({ 
     trigger: 'manual', 
     placement: 'right', 
     content: function() { 
      var message = "Count is" + a; 
       return message; 
     } 
    }); 
    $('a#test').popover("show"); 
    $('a#field2').html(a); 
}); 

當點擊點擊我的只有一個值被遞增,但如果我們改變消息行:

var message = "Count is" + i; 

這兩個值都會增加。

爲什麼會發生這種情況?

回答

1

在第一次單擊事件期間,彈出式構造只發生一次,因爲在不破壞舊彈出的情況下無法重建彈出式窗口。

所以你的情況:

  • "Count is " + a,您構建從a變量酥料餅的回調函數的當前值。由於您每次點擊都會'重新創建'a,因此所使用的參考將是第一個a變量(第一次點擊期間)中的一個。一旦你離開事件函數,這個引用將會丟失,所以你將無法更新它,並且只有第一個值將被用在回調函數中。
  • "Count is " + i,您使用全局變量i構建彈出式回調,該功能隨時隨地都可用,因此您可以對其進行修改。

顯然#field2會因爲你使用當前a變量,而不是舊的,從第一次點擊顯示當前值。

要了解多一點:

  1. 首先點擊:I = 1,= 1.您發送a,這可以被看作是a1(第一個)的回調函數)。然後你出去的事件函數,所以a變量被銷燬,但'它的內存'(它實際上指的是所有東西都是javascript中的引用),所以在內存中你仍然有類似a0 -> 1的東西在回調中使用。
  2. 第二次點擊:i = 2,a = 2。您不會發送a到彈出式構造函數,因爲您已經創建了彈出式窗口,所以它仍然是a0,它在回調函數中使用。然後你退出事件函數,現在a變量指向它的值。
  3. 第三點擊:同第二,等
+0

你可以在內容函數中放一個console.log(i,a)並看到它被多次調用 – user2846569

+0

@ user2846569我不是在討論回調函數,而是在討論popover構造函數。很明顯,每次點擊都會調用回調函數(因爲每次點擊都會觸發popover),但不會更改'a'引用。 – Holt

0

後宣佈click function()你的問題是solved.I我不知道爲什麼會這樣,但它似乎content functiona具有不同的值,然後acontent function外面做上述提到你更改後外var a你的結果。希望它有幫助。更新的小提琴是here

1

click事件中的popover()調用不重新創建每次點擊的酥料餅。它只在第一次點擊時創建,任何進一步的重新嘗試都會被忽略。

當您在content函數中使用i時,兩者都會遞增,因爲i被作爲全局進行分區,並且每次單擊時都會對其進行修改。 content函數沒有拍到i的快照,它每次調用content時都引用更新的變量。

當您更改content功能使用a,它並不會增加,因爲content只看到了第一次a宣佈由於a是一個局部變量(因爲content只創建一次)。

這可以通過對每一次點擊,這意味着現在的酥料餅被重建的每一次點擊,這導致兩個遞增破壞酥料餅進行測試:

Demo

注:該演示採用了最新的Bootstrap因爲2.02在你的小提琴中不支持destroy方法。