为什么logfunc
“未定义”?
var logfunc = function(obj) {
return function() {
console.log(obj)
}
}
t += '<a onclick="logfunc(this)"><</a>'
为什么logfunc
“未定义”?
var logfunc = function(obj) {
return function() {
console.log(obj)
}
}
t += '<a onclick="logfunc(this)"><</a>'
如果在全局范围之外声明引用longfunc
将无法访问,小提琴
我不提倡通过省略直接在全局范围内声明变量,var
但它是一个很好的例子:
function setupStuff() {
var logfunc = function(obj) { //defined within setupStuff scope
/*...*/
}
t += '<a onclick="logfunc(this)"><</a>';
}
function setupStuffDifferently() {
logfuncB = function(obj) { //defined in the global scope
/*...*/
}
t += '<a onclick="logfuncB(this)"><</a>';
}
我更愿意看到单独声明的函数
t += '<a onclick="logfunc(this)"><</a>';
function logfunc(obj) { //this would work when assigned through `onclick`
/*...*/
}
如果您可以使用该选项,我建议您使用像 jQuery 这样的库,它在分配和处理点击事件方面提供了更大的灵活性。
您收到“未定义 logfunc”错误,因为您logfunc
不在全局(即window
)范围内,并且使用 HTML 元素属性绑定的函数必须是全局的。
您可以通过以下方式解决此问题:
window.logfunc = function(obj) {
return function() {
console.log(obj)
}
};
但这仍然不会像您认为的那样做,因为它logfunc
只是返回一个调用的函数console.log
并且<a>
不知道它应该调用该function() { console.log(obj) }
函数,它只会将其视为一个真实值。我想你想要:
window.logfunc = function(obj) {
console.log(obj)
};
如果您想单击链接以生成控制台消息。
至于“DOM之间onclick
和通过DOM有什么区别”:
onclick
但您可以addEventListener
根据需要多次调用。如果你想将 JavaScript 片段作为字符串粘贴在一起,你可以绕过这个限制,但这很讨厌。addEventListener
呼叫 removeEventListener
从onclick
属性中删除事件处理程序比添加一个事件处理程序涉及更严重的字符串争论。onclick
HTML 和 JavaScript 会导致维护噩梦。