我已将所有函数包装在一个立即调用的函数表达式中,如下所示:
(function(){
"use strict";
function toggleComment(parentCommentID) {
$("form#" + parentCommentID).toggle();
}
function scrollBottom() {
window.scrollTo(0, document.body.scrollHeight);
}
})();
但是,在通过链接调用其中一个函数时:
<a href="javascript:void(0)" onclick="toggleComment(159); return false;">Reply</a>
Chrome控制台输出Uncaught ReferenceError: toggleComment is not defined
。我是否错误地认为应立即调用立即调用的函数表达式,因此应调用toggleComment
?我应该以不同方式调用该函数吗?
答案 0 :(得分:5)
功能toggleComment
不可见。它包含在你正在使用的就绪功能中;如果您希望能够像这样调用它(在大多数情况下不推荐),则必须将其提升到该函数之外并使其可以全局访问。
这与strict
无关。如果您删除strict
行,则此问题仍然相同。
答案 1 :(得分:2)
不再在全局范围内声明这些函数。尝试
window.toggleComment = function(parentCommentID) {
$("form#" + parentCommentID).toggle();
};
答案 2 :(得分:1)
您已在闭包内声明了这些函数。它们超出了HTML标记的范围。
您可以为<a>
标记设置ID,并将您的函数发布到全局范围,这样您就可以执行此操作:
(function(){
"use strict";
var toggleComment = function(parentCommentID) {
$("form#" + parentCommentID).toggle();
}
function scrollBottom() {
window.scrollTo(0, document.body.scrollHeight);
}
document.getElementById("yourATagId").onclick(function() {
toggleComment(159);
});
window.toggleComment = toggleComment;
})();
也许你可以从这个简单的单身人士模式中受益:
(function() {
var controller = {};
controller = new function() {
this.sampleProperty = "my property";
}
controller.yourFunction = function() {
var localVariable;
console.log("I can access " + this.property);
};
window.controller = controller;
})();
这样,controller
将为您的全球范围所知。