2016-08-31 42 views
0

我有以下的JavaScript如下爲什麼這個功能行爲古怪

function getExpiryDate(contract) { 
    var expiryDay; 
    var contractType; 
    var today = new moment(); 
    var today1 = new moment(); 

    var x = myFunction(4, 3); 
    var abc =3; 
    var xyz= 4; 
    var c = myFunction(abc, xyz); 

    console.log("abc is: "+abc); 
    console.log("xyz is: "+xyz); 
    console.log(today1); 

    expiryDay = getlastDayofMonth('Thursday',today1); 

    console.log(today1); /* Why has the value of today changed? */ 
} 

function getlastDayofMonth(dayName,date1) { 

    var endDate = date1.endOf('month'); 
    var lastDayOfMonth = endDate.format('dddd'); 
    var weekDayToFind = moment().day(dayName).weekday(); //change to searched day name 

    var searchDate = endDate; //now or change to any date 

    while (searchDate.weekday() !== weekDayToFind) 
    { 
     searchDate.subtract(1, 'days'); 
    } 

    return searchDate; 
} 

function myFunction(a, b) { 
    return a * b;    // Function returns the product of a and b 
} 

當我執行我得到以下輸出。

expirydate.js:11 abc is: 3 
expirydate.js:12 xyz is: 4 
expirydate.js:13 Moment { _d: Wed Aug 31 2016 10:21:04 GMT+0530 } 
expirydate.js:15 Moment { _d: Thu Aug 25 2016 23:59:59 GMT+0530 } 

我對完全混淆了爲什麼today1的值在函數中使用時發生變化。

+0

如果你只是做'moment()'而不是'new moment()',你會得到相同的結果嗎? –

+0

隨着一些不錯的縮進,你將有更大的機會讀取你的代碼。 – Bergi

+0

美化代碼 – jay

回答

2

因爲瞬間被寫在代碼的一個可變的風格這是發生一個範圍。這是相當令人驚訝的行爲。在看完Moment文檔之前,我幾次讀完代碼後,發現不出任何明顯的問題。

.endOf()方法變異日期,又名改變的那一刻,你的對象上調用它的日期:將其設置爲一個時間單元結束

器變化了原來的那一刻。

所以,當你調用該方法在這裏:

var endDate = date1.endOf('month'); 

它的變異date1,這意味着它在的地方修改date1並改變其時間。事實上,它看起來幾乎所有的時刻方法都會改變時刻對象。關於API設計不佳的原因有discussion on Github

在解決您的具體問題方面,這是一種個人風格偏好。我認爲不希望強制用戶在之前將對象克隆到一個函數。所以我會克隆功能裏面的瞬間:

function getlastDayofMonth(dayName,date1) { 

    var endDate = date1.clone().endOf('month'); 
4

因爲在JS中,對象通過引用而不是按值傳遞。這意味着你正在研究同一個對象。

爲了防止這種情況,你必須克隆的功能DATE1值到一個變量限於函數

+0

JavaScript中的值都被傳遞(即使它是一個指向可變對象的引用值)。沒有指針或共享變量。 – Bergi

+0

對象通過引用傳遞http://www.w3schools.com/js/js_function_parameters.asp – Sylwit

+3

一個神話。對象是引用值,所以你傳遞*引用*,是的,但不是,該參數不會是作爲參數傳遞的變量的引用(這就是「通過引用傳遞」的意思)。 – Bergi