javascript函数之间的区别
Differences between javascript function
我知道这个问题可能很傻,只是想知道,我不确定这个话题是否符合我目前的要求。但还是想问一下。
<button id="Clk">Click on me</button>
document.getElementById("Clk").onclick = function(){alert("firedme!")}
document.getElementById("Clk").onclick = fire();
function fire(){alert("I am fired!")}
我看到第一个"函数"没有在页面加载或刷新时触发,但第二个fire()被触发
当页面加载时,这个函数不会在点击时被触发。我很困惑,只是需要澄清一下。
您需要将fire
传递给onclick
作为函数引用,而不是调用。
document.getElementById("Clk").onclick = fire;
当你传递fire()
到onclick处理程序时,它立即触发,从函数返回的是你正在设置的onclick。通过向函数传递引用,它将停止函数运行,直到事件被触发。它本质上与上面的匿名函数处理程序相同。
rlemon很好地为您做了一个很好的演示小提琴<——在这里
第二个立即触发,因为您使用了括号()
。当将事件处理程序分配给现有函数时,不要包含圆括号。
函数直接执行,返回值被赋值为事件处理程序。
为了说明,它与以下操作相同:
var result = fire();
console.log( result ); // undefined
document.getElementById("Clk").onclick = result;
可以看到,undefined
作为事件处理程序被传递。
另外,我还想补充一些东西。
首先,把onclick
看作一个对象的普通属性。
所以,object.onclick = value
,其中value = functionName()
是完全正确,例如,functionName()
可以返回一个值使用return something;
但是onclick
不是一个普通的属性。当JS引擎在浏览器中遇到基于事件的属性赋值(例如onclick
, ondblclick
, onmouseover
等),它为每个属性创建一个堆栈元素,由映射b/w组成onSomeEvent和handler。
处理器是一个函数对象。但是如果你这样做element.onSomeEvent = functionName();
你只是在调用函数functionName()
,这将是好的,如果functionName()
定义为
function functionName() {return function(){/*do something*/};}
但是因为在您的示例中functionName
没有返回一个函数,所以您会看到一个意外的结果。这是主要的JavaScript等语言的缺点。在强类型语言中抛出一个错误…因为
class Element {
Function onclick = null;
Function ondblclick = null;
/*other code*/
}
document.getElementById('idName').onclick = new Function(); // correct
document.getElementById('idName').onclick = function(){}; // correct
document.getElementById('idName').onclick = functionName();
/*
* correct if functionName defined as
* Function functionName() {return new Function();} or
* Function functionName() {return function(){};}
* and incorrect for any other case
*/
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- javascript函数的:和=之间的区别
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- Math.min()和Math.max()之间有什么区别?在Javascript中
- webpack开发模式和生产构建模式之间有什么区别
- servlet和代理servlet之间的区别
- Javascript 类型未定义和 void 之间的区别
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 布局引擎和javascript引擎之间的区别
- 什么's extjs中的mon()和on()之间的区别
- type=text/javascript和language=javascript之间的区别
- 函数()和新函数()之间的区别
- JavaScript中let和var之间的区别
- 蓝鸟的done()和spread()之间的区别
- Node.js HTTP/NET——连接和请求之间的区别