2010-09-13 108 views
3

我有下面的代碼片斷,它使用'事件' 我的開發人員爭辯說'var事件'的範圍被限制爲'如果'條件。 這是真的。我怎樣才能使這是一個更好的代碼這個對象的範圍是什麼

function prepForDrag(obj, event) {  
    if(event= "undefined"){ 
     var event=obj || window.event; 
    } 
    if (event.altKey) { 
     showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);  
     var thisForm = eval('document.${formName}'); 
     // ... 
     enableDragState(obj); 
     disableClickEditHandler(obj); ## remove 'normal' line sched click handling in dd mode 
    } 
    } 
+3

這篇文章將是有趣的:http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop/ – spender 2010-09-13 13:22:23

回答

10

這是不正確的。在JavaScript中有無塊範圍,只有功能範圍*。在函數中引入的所有變量都被提升到函數的頂部。

所以這個代碼:

function prepForDrag(obj, event) { 
    if (event = "undefined") { 
     var event = obj || window.event; 
    } 
    // ... 
} 

得到一定程度的解釋是這樣的:

function prepForDrag(obj, event) { 
    if (event = "undefined") { 
     event = obj || window.event; 
    } 
    // ... 
} 

由於Marcel Korpel的指出,聲明變量event在這種情況下沒有必要,因爲event已經是一個局部變量因爲它是一個函數參數。有關更詳細的信息,請閱讀Ben Cherry的文章JavaScript Scoping and Hoisting

不過在代碼中還有兩個額外的問題。

  1. 在此條件下,你使用的=賦值運算符,而不是==比較操作。所以病情總是評估爲真。

  2. 如果要檢查是否給出函數參數,請使用typeof event == 'undefined'語句。

我恐怕這裏還有一個問題。這種情況的目的是什麼?請問objevent有什麼關係?現代瀏覽器將事件對象作爲參數傳遞給事件處理函數,但是some do not。爲了避免該問題,下面的模式一般用:

function prepForDrag(e) { 
    var event = e || window.event; 
    // ... 
} 

* NB:有在JavaScript 1.7,其提供內部功能塊範圍引入let statement。目前it's only supported in Firefox

+0

這仍然是不完全正確的:因爲'事件'已經一個給'prepForDrag'的參數,它已經具有本地範圍,並且不需要使用'var'聲明變量。你最後一個標準化Event接口的例子是不正確的:Event接口作爲* first *參數傳遞給一個事件處理程序,所以在這種情況下'obj'將保存Event接口,'e'永遠不會。 – 2010-09-13 14:18:33

+0

@Marcel Korpel:你是對的。感謝您指出。 – 2010-09-13 14:38:54

2

JavaScript沒有塊範圍(除catch塊中的異常變量),所以在你的情況,event變量函數範圍內。您可以做的最好的方法是使用新值重新指定event,或者可以使用其他變量名稱。

6

由於event已經是prepForDrag的一個參數,其範圍是本地的功能

但你if條件是錯誤的:

if(event= "undefined") 

這就賦予"undefined"event和計算結果爲true。你或許應該使用

if (typeof event == "undefined") 

或(我想你想要的是)

function prepForDrag(event) { 
    event = event || window.event; 
    if (event.altKey) { 
     showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);  
     var thisForm = eval('document.${formName}'); 
     ................................ 
     enableDragState(obj); 
     disableClickEditHandler(obj); // remove 'normal' line sched click handling in dd mode 
    } 
} 

順便說一句,你爲什麼eval荷蘭國際集團document.${formName}

+0

@Korpel:這是非常古老的(5年)code.never接觸/改造,除非面臨問題。這一個是FF兼容性問題。因此,評估基本上是閱讀表格數據,當然這些數據很差勁:-( – GustyWind 2010-09-14 12:39:54