我正在使用闭包编译器为我的所有代码创建单个javascript文件。 我正在通过PhantomJS运行我的代码。
这是我的代码
function process(inputParams, dataCollector) {
var webpage = require('webpage').create();
webpage.open(entityResolvedFilePath, function(status) {
var hasnodes = webpage.evaluate(function() {
var nodesInfo= (document.getElementsByTagName('requirednode').length;
if (nodesInfo) {
MathJax.Hub.Register.MessageHook("Math Processing Error",function (message) {
throw message;
});
MathJax.Hub.queue.Push(function() {
mathJaxCleaner.cleanMathJaxOutput();
window.callPhantom();
});
}
return hasMathNodes;
});
if (!hasMathTags) {
webpage.onCallback();
}
}
else {
webpage.onCallback();
}
}
});
我想在MathJax.Hub.queue.Push中调用cleanMathJaxOutput函数。
它在本地工作,因为我没有在本地运行缩小代码。
但是,当我通过闭包编译缩小此代码时,我的代码失败并且错误 reference error could not find mathJaxCleaner
这可能是因为Phantomjs的webpage.evaluate创建了一个不同的闭包范围,我没有全局变量mathJaxCleaner。
我已经像这样声明了cleanMathJaxOutput。
var mathJaxCleaner = new Object();
mathJaxCleaner.cleanMathJaxOutput =function() {}
我还尝试将mathJaxCleaner声明为函数,然后在其原型上附加函数,但没有任何东西适合我。 缩小代码之后会变成这样的东西。
var P = {
A: function() {
function a(a) {
a && a.parentNode.removeChild(a)
}
function b(a) {
if (a)
for (; 0 != a.length;) this.removeNode(a[0])
}
function d(a) {
var b = document.createElement("defs");
a.insertBefore(b, a.childNodes[0]);
a = a.getElementsByTagName("use");
for (var c = 0; c < a.length; ++c) {
var d = a[c].getAttribute("href");
b.appendChild(document.getElementById(d.substr(1)).cloneNode(!0))
}
}
for (var c = document.getElementsByClassName("MathJax_SVG"), e = 0; e < c.length; e++) {
for (var f = c[e], v = f.childNodes, w = 0; w < v.length; w++) "svg" ==
v[w].tagName && d(v[w]);
f.style.fontSize = "inherit";
"inline-block" === f.style.display && (f.style.display = "inline")
}
some more code here...
}
};
缩小代码中的函数调用看起来像 P.A() 但是在执行时PhantomJS说参考错误无法找到变量:P
如何解决此问题。
答案 0 :(得分:0)
如果使用compilation_level
ADVANCED_OPTIMIZATIONS
的Closure Compiler,则必须导出您希望外部世界可用的符号(var,function等)(未编译)。 / p>
之前使用@export
或在需要导出的每个符号后使用goog.exportSymbol(publicPath, object)
。
为此,您需要包含闭包库并将以下参数添加到闭包编译器:--generate_exports --js closure-library-path/closure/goog/base.js
答案 1 :(得分:0)
我得到了解决这个问题的方法。
在PhantomJS函数中,webpage.evaluate不仅仅是一个闭包,它存在于另一个上下文(网页)的内部,其中所有外部变量和函数都不存在,但是一个网页的DOM是相反。
所以我在window对象中明确地添加了我的函数。
window['myfunctionName'] = myfunctionName;
function myfunctionName()
{
// do something
}