Javascript事件侦听根据匿名或命名函数的使用而有所不同
我使用以下代码将一个文本区域的输入复制到另一个文本区域:Javascript事件侦听根据匿名或命名函数的使用而有所不同,javascript,events,dom,Javascript,Events,Dom,我使用以下代码将一个文本区域的输入复制到另一个文本区域: /** * Copies the values entered into the old description * into the new description, until the user focuses * on the new description */ var DescriptionLinker = (function() { var elOldDescription, elNewDes
/**
* Copies the values entered into the old description
* into the new description, until the user focuses
* on the new description
*/
var DescriptionLinker = (function() {
var elOldDescription,
elNewDescription,
linkIsBroken;
this.init = function() {
console.log('Initializing DescriptionLinker');
elOldDescription = document.getElementById("old-description");
elNewDescription = document.getElementById("new-description");
linkIsBroken = false;
linkDescriptions();
watchLinkBreak();
}
// Assigns values to 'this'
var finalize = function() {
this.elOldDescription = elOldDescription;
this.elNewDescription = elNewDescription;
}
var linkDescriptions = function() {
elOldDescription.addEventListener("keyup", linkListener(), false);
}
var unlinkDescriptions = function() {
elOldDescription.removeEventListener("keyup", linkListener(), false);
}
var linkListener = function(){
elNewDescription.value = elOldDescription.value;
}
var watchLinkBreak = function() {
console.log("Watching for link break");
elNewDescription.addEventListener("focus", function(){
unlinkDescriptions();
});
}
finalize();
return this;
})();
DescriptionLinker.init();
代码可以工作,但是值不会出现在
中,直到我关注文本区域。如果我用相同的匿名函数替换对linkerfunction()
的调用,则当我在旧描述
中键入时,值会正确显示在新描述
文本区域中。你知道为什么吗
为了澄清,以下操作正确:
var linkDescriptions = function() {
elOldDescription.addEventListener("keyup", function(){
elNewDescription.value = elOldDescription.value;
}, false);
}
var unlinkDescriptions = function() {
elOldDescription.removeEventListener("keyup", function(){
elNewDescription.value = elOldDescription.value;
}, false);
}
PS所有这一切的原因是从传统系统过渡:当然!当您传递一个已定义的函数来代替匿名函数时,您将省略
()
,否则此函数将在编译后立即被调用。所以,改变
lOldDescription.addEventListener("keyup", linkListener(), false);
到
当然!当您传递一个已定义的函数来代替匿名函数时,您将省略
()
,否则此函数将在编译后立即被调用。所以,改变
lOldDescription.addEventListener("keyup", linkListener(), false);
到
呃,您意识到
DescriptionLinker===window
不是吗?函数中分配给它的所有属性都被创建为全局对象的属性?也就是说,它们变成了全局变量?例如,typeof window.init=='function'
.noooop,未实现。我知道有几种方法可以解决这个问题(双关语),即返回一个JSON对象,但是为什么this
指的是全局对象?我以为它将由anon函数确定作用域。这与作用域无关。它是一个局部变量,由函数的调用方式或用户设置。您没有将其设置为默认的全局(浏览器中的窗口)对象,或者在严格模式下未定义。好的,感谢您指出这一点,认识到我对Nower的误解,您意识到DescriptionLinker===window
不是吗?函数中分配给它的所有属性都被创建为全局对象的属性?也就是说,它们变成了全局变量?例如,typeof window.init=='function'
.noooop,未实现。我知道有几种方法可以解决这个问题(双关语),即返回一个JSON对象,但是为什么this
指的是全局对象?我以为它将由anon函数确定作用域。这与作用域无关。它是一个局部变量,由函数的调用方式或用户设置。您没有将其设置为默认的全局(浏览器中的窗口)对象,或者在严格模式下未定义。好的,感谢您指出这一点,现在意识到我错了什么