我有这样一个js代码:
function Global(params) {
...
}
var g = {
onDocLoad: function() {
// on DOM load I instantiate the Global function-constructor
// which is above this line, so it is already in scope
var global = new window.Global(params);
}
window.addEventListener("load", g.onDocLoad, false);
如果我使用这个文件作为静态文件,不进行预编译,一切都可以正常工作。
如果我预编译它:
rake assets:precompile:all RAILS_ENV=development
然后刷新页面,得到:
Uncaught TypeError: object is not a function
正好和new window.Global(params);
在同一条线上。它说Global
不是一个函数。但这不可能是真的。它是一个函数。
我调试了这一行,发现在到达这一行的时候,Global
在全局范围内是null
。没有这样的函数具有这样的名称
我的问题与这些问题相似:
Javascript "Uncaught TypeError: object不是一个函数"结合性问题
运行rake assets预编译后,在not a function中得到undefined
但是他们的解决方案不适用于我的情况。
可能是什么问题?为什么预编译会破坏工作代码?
所以,我已经学会了如何避免它。但我不知道为什么会这样。
在开发模式中,资产按照清单文件中指定的顺序作为单独的文件提供服务。这个清单:
//= require core
//= require projects
//= require tickets
将生成以下HTML,三个require
-三个独立的标签:
<script src="/assets/core.js?body=1" type="text/javascript"></script>
<script src="/assets/projects.js?body=1" type="text/javascript"></script>
<script src="/assets/tickets.js?body=1" type="text/javascript"></script>
但是带串联的链轮不是不带串联的链轮(如上所述)。如果你想连接文件,你必须关闭调试模式:
config.assets.debug = false
当调试模式关闭时,链轮连接并在所有文件上运行必要的预处理器。关闭调试模式后,上面的清单将生成:
<script src="/assets/application.js" type="text/javascript"></script>
现在三个独立的文件合二为一了。
解决方案:
所以我试了
config.assets.debug = false
// and then
rake assets:precompile:all RAILS_ENV=development
,错误消失。
我认为原因在于文件的顺序。与debug = true
预编译失去正确的文件序列,尽管事实上,正确的序列是在我的清单表示(这只不过是一个简单的js文件,somefile.js
,你添加到你的页面;