2015-12-27 44 views
4

我試圖在模塊部分運行Eloquent Javascript中的這個簡短程序。Javascript - 在Node.js中導出vs瀏覽器

var weekDay = function() {}(); 

(function(exports) { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
    "Thursday", "Friday", "Saturday"]; 

    exports.name = function(number) { 
    return names[number]; 
    }; 
    exports.number = function(name) { 
    return names.indexOf(name); 
    }; 
})(this.weekDay = {}); 

console.log(weekDay.name(weekDay.number("Saturday"))); 

正確的輸出應該是// -> Saturday

它在瀏覽器中完美工作。然而,當我嘗試在節點解釋器中運行它,我得到這個錯誤:

TypeError: Cannot read property 'name' of undefined 

我只能假設它是與節點的方式處理出口關鍵字。有人能幫助我至少對這種行爲有一個粗略的理解嗎?

+1

它可能是'this.weekDay'。嘗試將其改爲「weekDay」。 – Louy

+1

另外第一行是無用的。只要保持'var weekDay;'。 – Louy

+0

在Node模塊中,'this'不是'global',而是'exports'。 –

回答

3

尼爾萊維的答案是正確的,但我也發佈了這個答案,因爲你在談論模塊。這就是你如何製作一段代碼的模塊。

//create your module like this and put this module in a separate file (ex. weekDay.js) 
var weekDay = (function() { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 

    var name = function(number) { 
    return names[number]; 
    }; 
    var number = function(name) { 
    return names.indexOf(name); 
    }; 

    return { 
    number: number, 
    name: name 
    } 
})(); //it's a self executing function 

//exporte module 
module.exports = weekDay 



//to get your module (in another file) 
var weekDayModule = require('./weekDay'); //path to module 

console.log(weekDayModule.name(weekDayModule.number('Saturday'))); 
+0

如果有不清楚的地方,請不要猶豫詢問更多信息;) –

2
在node.js中

這一行:

var weekDay = function() {}(); 

只是產生一個未定義的變量平日,因爲它是所有定義一個函數有連接體爲空(在你的代碼中{}),然後運行它的時候了。因爲身體是空的(也是最重要的,沒有return語句),它產生不確定的

做你想要的是把整個定義這個函數內部,並定義揭露什麼,像這樣的方式:

var weekDay = function() { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
    "Thursday", "Friday", "Saturday"]; 

    var name = function(number) { 
    return names[number]; 
    }; 
    var number = function(name) { 
    return names.indexOf(name); 
    }; 

    return { 
    number: number, 
    name: name 
    } 

}(); 


console.log(weekDay.name(weekDay.number("Saturday"))); 
+0

這個解決方案實際上或多或少是本書中使用的原始工作示例。 Haverbeke對我寫的替代版本有這樣的評論:「對於更大的模塊,在函數結束時將所有導出的值收集到對象中變得尷尬,因爲許多導出的函數可能很大,更喜歡把它們寫在別的地方,一個方便的選擇是聲明一個對象(通常命名爲exports),並在我們定義需要導出的東西時添加屬性。「 –

+0

@ooronning:檢查我的答案,這是如何在單獨的文件中導出模塊的常用方法 –

0

將第一行更改爲var weekDay = {};,當您調用您的iife時,只需在週日放入您在第一行創建的內容即可。