2017-03-31 15 views
0

變量賦值後仍然未定義的回調函數在Javascript那麼我有以下用於phantomjs PhantomJS

var time = 1490543999999999; 
    var endTime = time - 518400000000 * 10; 
    var mintime = time - 518399999999; 
    console.log("mintime after assignment is"+mintime); 
    var loopnumber = 6; 

    page.open('https://myactivity.google.com/item?min=' + mintime + '&max=' + time + '&product=5,6,7,10,11,12,13,15,19,20,25,27,28', callback); 

    function callback() { 
    console.log("inside callback and loopnumber is "+loopnumber+"and time is "+time+", and mintime is "+mintime+'. URL: https://myactivity.google.com/item?min=' + mintime + '&max=' + time + '&product=5,6,7,10,11,12,13,15,19,20,25,27,28'); 
    page.render('/Users/jMac-NEW/Documents/FILEMAKER OCLC/login_test33.7_brkpoint' + loopnumber + '.png'); 
    fs.write('/Users/jMac-NEW/Documents/FILEMAKER OCLC/login_test33.7_brkpoint' + loopnumber + 'html.html', page.content, 'w'); 
    time -= 518400000000; 
    loopnumber++; 
    if (time > endTime) { 
     var mintime = time - 518399999999; 
     page.open('https://myactivity.google.com/item?min=' + mintime + '&max=' + time + '&product=5,6,7,10,11,12,13,15,19,20,25,27,28', callback); 
    } 
    else { 
     phantom.exit(); 
    } 
    } 

這是第一的console.log輸出:

mintime after assignment is1490025600000000 

但當涉及到callback()中的console.log時,這是輸出:

inside callback and loopnumber is 6and time is 1490543999999999, and mintime is undefined. URL: https://myactivity.google.com/item?min=undefined&max=1490543999999999&product=5,6,7,10,11,12,13,15,19,20,25,27,28 

爲什麼mintime =未定義,當其他變量(loopnumber和時間)不是?

+0

該函數內的'mintime'的第二個聲明會隱藏外部聲明。 – user5090812

+0

@ user5090812但爲什麼它最終未定義?即使是第二次聲明,它仍然是一個數字 – humanitiesclinic

回答

0

有在Javascript中的一個概念叫做吊裝 - 如果聲明一個變量,它已經使用後,腳本解釋器自動將它的聲明,以當前範圍的頂部內部。

所以,你的腳本實際讀取到這樣的JS:

function callback() { 
    var mintime; // <-- declaration moved here 

    // mintime is not yet defined 
    console.log("and time is "+time+", and mintime is "+mintime); 
    // ... 
    if (time > endTime) { 
     mintime = time - 518399999999; // it's been declared already and now it's defined 
    } 
    else { 
     phantom.exit(); 
    } 
    } 

因此,解決辦法很簡單:在回調從分配去除varmintime,這樣的變量將被分配到外(窗口)範圍mintime ,就像你想要的一樣。

相關問題