2015-12-15 10 views
0

所以我經歷雄辯JS書的「模塊」第一章,我已經遇到了與功能(出口)部分的問題。功能(出口)將返回錯誤「無法設置屬性‘工作日’的未定義」

(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(1)); 

回報

Cannot set property "weekDay" of undefined 

但是在本書的網站上的在線編輯器完全相同的代碼運行沒有問題,並返回「星期一」。

我在想,如果這是Adobe Brackets的問題。

+0

省略'this.',一切都會好的。看起來你想要分配給一個變量,而不是在你不知道的某個對象上創建一個屬性(而這在這裏顯然不存在)。 – Bergi

+0

@Bergi是的,這工作!謝謝。然而,我想知道它爲什麼在網站[this](http://eloquentjavascript.net/10_modules.html)上的_this_下工作,它在** Objects作爲接口**部分。 – matveytn

+0

正如下一段所說,「*上一個模式通常被用於瀏覽器的JavaScript模塊所使用*」,在這種情況下「*在函數之外,this指的是全局作用域對象* – Bergi

回答

1

使用不依賴於在全球範圍內的腳本,其中this將是全局對象正在執行的模塊模式。我推薦

var weekDay = (function (exports) { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
       "Thursday", "Friday", "Saturday"]; 
    return { 
     name: function (number) { 
      return names[number]; 
     }, 
     number: function (name) { 
      return names.indexOf(name); 
     } 
    }; 
}()); 

所以是的,這是由您的環境引起的,但代碼首先是脆弱的。如果您希望繼續使用該exports的事情,你也可以做

var weekDay; 
(function (exports) { 
    … 
})(weekDay = {}); 

或交替檢查How to get the global object in JavaScript?Getting a reference to the global object in an unknown environment in strict mode

相關問題