0

我有一個問題,我的一些聲明和定義的變量在函數內部使用它們時已經被報告爲未聲明。 所以我一直在玩它,它看起來像沒有 - 每當我添加新的變量,它們被定義在代碼後直接定義,然後在功能塊內,他們確實報告未定義。新定義的變量在函數中報告「undefined」,而其餘的不是?

我一直在使用資源,並沒有釋放它們,如URL對象和數據庫連接,所以想知道是否因爲內存不足?

所以我重新啓動了我的手機 - 不行。此外,新變量下定義的舊變量是否報告它們的確定義?而新的變量仍然沒有。

更多的澄清,這裏是Visual Studio是報告: confusing variable error ^每次在該塊工作這些變量的正確,除了「newVar」和其他新定義的變量

(免責聲明一句:我很不是專業 - 顯示並不代表生產就緒代碼只是一個業餘愛好者,和任何代碼,謝謝)

示例代碼的問題:

(function() { 
    "use strict"; 
    var variable1, 
     variable3 = 10, 
     variable2 = 100, 

    function clickHandler() { 
     console.log(variable1); //prints "undefined" in green text. 
     console.log(variable2); //prints "100" 
     console.log(variable3); //prints "'variable3' is undefined" in red text 
    } 
    clickHandler(); 
})(); 

開發板的!使用最新的公共SDK在Windows 10上編寫Windows Phone 8.1應用程序,在Visual Studio 2015社區版本中編寫Windows Phone 8.1應用程序。

+0

你真的***得到:*「變量3是未定義的」*當你運行該示例代碼或者只是僞輸出來幫助描述你的問題? – Emissary

+0

照片應該澄清。無論我定義的變量是什麼,我都會得到'soInSo',儘管它的定義與其他變量完全相同,但它們的工作原理是一樣的。 – naf456

回答

0

我似乎欠了道歉。 與大多數錯誤一樣,我將它簡化爲一個簡單的語法錯誤 - 而不是定義變量 - 事實證明,如果Visual Studio調試器沒有在任何表達式的內部作用域內引用它們,它就不會限定外部變量。 讓我看看函數變量聲明的代碼只是有語法錯誤:

var lastPanX = 0; 
var lastPanY = 0; 
function onPan(ev) { 
    scrollEl.scrollLeft += lastPanX - ev.deltaX; 
    scrollEl.scrollTop += lastPanY - ev.deltaY; 
    lastPanX = ev.deltaX; 
    lastPanY = ev.deltaY; 
    if (ev.eventType == Hammer.INPUT_END) { 
     var lastPanX = 0; //didn't see the var's 
     var lastPanY = 0; // 
    } 
} 

我沒有注意到missplaced VAR關鍵字,調試這個功能,發現了lastPanX被報告未申報,因爲它從來沒有用在函數範圍內的表達式中,然後發現我定義的每個變量都沒有聲明 - 恐慌。

問題現在解決了,謝謝你的時間。

Nathan。

0

在你的例子中,var行需要以a;

var variable1, 
    variable3 = 10, 
    variable2 = 100; 

然後,變量1將是clickHandler函數中唯一未定義的變量。

3

在參考我的意見,我要你的迴應爲「無」,建議的示例輸出是不是你會得到什麼,如果你居然跑的代碼 - 我會解釋爲什麼我問。 ..

你所指的是所謂的詞法作用域,它是一個核心概念 - 你可以可靠地訪問函數閉包中的外部變量,事實上你的例子運行沒有問題 - 至少在V8引擎上,我不是現在可以在Microsoft風格的環境中進行測試。

唯一值得注意的觀察,你可以從它(除了錯字)將是一個函數作爲一個聲明,而不是一個表達式的使用。請參閱this post on the differences between the two - 我沒有花費任何時間調查,但可以想象,Javascript hoisting訂單可能會在不同的Javascript引擎之間產生古怪的行爲差異。

這可能是一個紅色的鯡魚,但因爲你所期望的所有變量出現在這樣的情況下undefined - 它很容易驗證,如果這是你的問題,但是通過簡單地換出函數聲明:

function clickHandler(){  // ... swap this function statement 
var clickHandler = function(){ // ... for this function expression 

現在到我懷疑的其實是問題。我在屏幕截圖中看不到onPinch函數,但從我看到的內容中沒有提及newVar。您的控制檯中的錯誤不是由您的代碼生成的,而是由您嘗試通過調試程序將變量的引用注入到執行上下文中之後的。

當你的代碼運行時,編譯器將不只是轉儲在詞法範圍到當地環境的一切 - 這將讓的優化,你不能沾裏面的一個突破點函數,並期望在實際代碼中看到該函數未使用的參數。

如果你想玩弄在控制檯變量,使得它任意一個參考的地方 - 例如,即使下面將確保它在範圍:

function onPinch(ev){ 
    newVar; 
    //... 
} 
+1

感謝您的真棒答案。偉大的參考也。 – naf456

相關問題