[英]Name this typeError? Probably scope error
警告:可能不是typeError。 做腳本算法很有趣。 嘗試學習/解決問題的方法=>我注釋掉了未定義的數組。 我不知道為什么會引發錯誤。
function arrayManipulation(n, queries) { var array = new Array(n).fill(0) var x = 0 var recurring = (argmnt, query, y) => { //problem start here var start = query[0], end = query[1] //problem end somewhere else var newArg = argmnt.map((el, index) =>{ if(index+1 >= start && index+1 <= end){ return query[2] + el }else{ return el } }) console.log(newArg) if ( y < queries.length ){ y += 1 recurring(newArg, queries[y], y) }else{ return newArg } } var solution = recurring(array, queries[x], x) } arrayManipulation(5, [[1, 2, 100], [2, 5, 100], [3, 4, 100]])
盡管腳本可以正常運行,並提供所需的輸出。 它在節點中引發stderr或在JS中引發typeerror。 我只想知道為什么。
問題出在你的y
變量上。 在檢查y < queries.length
, 首先檢查長度, 然后遞增。
如果數組的長度為3
(如示例所示),則將檢查y
是否小於3
,如果它小於2
,則通過測試,將其遞增為3
,然后將queries[3]
傳遞給下一個recurring()
調用。 不過, queries
的最后一個元素是queries[2]
。 因此, queries[3]
是undefined
並且在函數內部,您嘗試使用query[0]
來訪問undefined
屬性0
。 那是錯誤。
function arrayManipulation(n, queries) { var array = new Array(n).fill(0) var x = 0 var recurring = (argmnt, query, y) => { //problem start here var start = query[0], end = query[1] //problem end somewhere else var newArg = argmnt.map((el, index) =>{ if(index+1 >= start && index+1 <= end){ return query[2] + el }else{ return el } }) console.log(newArg) y += 1 // now is here if ( y < queries.length ){ // was here recurring(newArg, queries[y], y) }else{ return newArg } } var solution = recurring(array, queries[x], x) } arrayManipulation(5, [[1, 2, 100], [2, 5, 100], [3, 4, 100]])
您有兩種選擇:要么先增加,然后再進行檢查(如上面的代碼段所示),要么檢查queries.length - 1
,如下所示:
if ( y < queries.length - 1 ){
另外,還有一些優化。 您不需要y
變量。 它基本上只是x
但作為參數傳遞。 您可以從recurring()
訪問x
,因此您最好使用它 :
function arrayManipulation(n, queries) { var array = new Array(n).fill(0) var x = 0 var recurring = (argmnt, query) => { //problem start here var start = query[0], end = query[1] //problem end somewhere else var newArg = argmnt.map((el, index) => { if (index + 1 >= start && index + 1 <= end) { return query[2] + el } else { return el } }) console.log(newArg) x += 1 if (x < queries.length) { recurring(newArg, queries[x], x) } else { return newArg } } var solution = recurring(array, queries[x]) } arrayManipulation(5, [ [1, 2, 100], [2, 5, 100], [3, 4, 100] ])
這是我從您的腳本中得到的:
{
"message": "Uncaught TypeError: Cannot read property '0' of undefined",
"filename": "https://stacksnippets.net/js",
"lineno": 20,
"colno": 22
}
由於這部分,這是正常的:
if ( y < queries.length ){
y += 1
recurring(newArg, queries[y], y)
您有3
查詢。 在某一點上, y
等於2
。
它會增加並等於3
。 queries[3]
不存在,將是undefined
。 (因為,您確實知道數組的第一個索引為0,對嗎?)
然后,在下一次recurring
,您將對其調用query[0]
,但是它是undefined
:它將崩潰。
僅此而已;) if
條件不好,您if
可以了;)
它必須是if ( y < queries.length - 1 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.