javascript函数的执行顺序
为了更好地理解JavaScript,我回到了基础。我有一个测试网站。这是我的密码javascript函数的执行顺序,javascript,jquery,Javascript,Jquery,为了更好地理解JavaScript,我回到了基础。我有一个测试网站。这是我的密码 <html> <head> test </head> <script type="text/javascript"> function saySomething(message) { alert(message); } saySomething('Hello world!'); function addLoadListener(fn){ window.addEv
<html>
<head>
test
</head>
<script type="text/javascript">
function saySomething(message)
{
alert(message);
}
saySomething('Hello world!');
function addLoadListener(fn){
window.addEventListener('load', fn, false);
alert("the previous alert came from onload");
}
addLoadListener(saySomething);
</script>
<body>
<div>blah blah blah</div>
</body>
</html>
测试
函数saySomething(消息)
{
警报(信息);
}
说点什么(“你好,世界!”);
函数addLoadListener(fn){
window.addEventListener('load',fn,false);
警报(“上一个警报来自onload”);
}
addLoadListener(说点什么);
废话废话
因此,有一个函数,说点什么
提醒你好世界代码>。我将它添加到addLoadListener
中,以便在页面加载期间调用它。直到这一部分都很好。但是在那之后,当代码运行时会再次被调用,并提醒[object Event]
,而不是Hello World代码>。为什么?我错过了什么
谢谢也许你错过了你的论点
<html>
<head>
test
</head>
<script type="text/javascript">
function saySomething(message)
{
alert(message);
}
saySomething('Hello world!');
function addLoadListener(fn){
window.addEventListener('load', fn, false);
alert("the previous alert came from onload");
}
addLoadListener(saySomething('Hello world!'));
</script>
<body>
<div>blah blah blah</div>
</body>
</html>
测试
函数saySomething(消息)
{
警报(信息);
}
说点什么(“你好,世界!”);
函数addLoadListener(fn){
window.addEventListener('load',fn,false);
警报(“上一个警报来自onload”);
}
addLoadListener(说点什么(“你好,世界!”);
废话废话
可能是因为您缺少论点
<html>
<head>
test
</head>
<script type="text/javascript">
function saySomething(message)
{
alert(message);
}
saySomething('Hello world!');
function addLoadListener(fn){
window.addEventListener('load', fn, false);
alert("the previous alert came from onload");
}
addLoadListener(saySomething('Hello world!'));
</script>
<body>
<div>blah blah blah</div>
</body>
</html>
测试
函数saySomething(消息)
{
警报(信息);
}
说点什么(“你好,世界!”);
函数addLoadListener(fn){
window.addEventListener('load',fn,false);
警报(“上一个警报来自onload”);
}
addLoadListener(说点什么(“你好,世界!”);
废话废话
函数saySomething(消息)
{
警报(信息);
}
说点什么(“你好,世界!”);
函数addLoadListener(fn){
window.addEventListener('load',fn,false);
警报(“上一个警报来自onload”);
}
addLoadListener(函数(){saySomething('Hello world!')});
函数saySomething(消息)
{
警报(信息);
}
说点什么(“你好,世界!”);
函数addLoadListener(fn){
window.addEventListener('load',fn,false);
警报(“上一个警报来自onload”);
}
addLoadListener(函数(){saySomething('Hello world!')});
问题在于,一旦将saySomething
函数作为事件侦听器附加到窗口的load事件,事件触发时会使用不同的参数调用它。实际上,参数是一个事件对象,这就是为什么您会看到[object event]
警报
虽然我不知道代码的真正用途,但如果您想提醒“Hello World!”
字符串,并且不需要触发事件附带的事件参数,则可以将saySomething函数的第一个参数绑定到“Hello World!”
:
编辑:Function.prototype.bind创建一个新函数,其中此
和新函数的所有参数都可以“绑定”到特定值。需要注意的是,bind创建了一个新函数,并保留了原来的函数。您可以创建任意多个原始版本的绑定版本
如果调用boundHandler(“其他东西”)
或boundHandler()
,“Hello World!”
仍将收到警报,而不是新文本。这就是事件处理代码以后工作的原因
如果以这种方式创建绑定函数:
function alertThis() { alert(this); }
var boundFn = alertThis.bind("my new this");
alertThis() // "[object Window]" is alerted
boundFn() // "my new this" is alerted
下面是有关Function.prototype.bind:。的更多信息。问题是,一旦将saySomething
函数作为事件侦听器附加到窗口的load事件,事件触发时会使用不同的参数调用它。实际上,参数是一个事件对象,这就是为什么您会看到[object event]
警报
虽然我不知道代码的真正用途,但如果您想提醒“Hello World!”
字符串,并且不需要触发事件附带的事件参数,则可以将saySomething函数的第一个参数绑定到“Hello World!”
:
编辑:Function.prototype.bind创建一个新函数,其中此
和新函数的所有参数都可以“绑定”到特定值。需要注意的是,bind创建了一个新函数,并保留了原来的函数。您可以创建任意多个原始版本的绑定版本
如果调用boundHandler(“其他东西”)
或boundHandler()
,“Hello World!”
仍将收到警报,而不是新文本。这就是事件处理代码以后工作的原因
如果以这种方式创建绑定函数:
function alertThis() { alert(this); }
var boundFn = alertThis.bind("my new this");
alertThis() // "[object Window]" is alerted
boundFn() // "my new this" is alerted
以下是有关Function.prototype.bind:的更多信息。当“加载”事件发生时,它会以这种方式调用函数:“saySomething(event)”-第一个参数是事件对象。不是一串
因此,您必须更改代码中的某些内容。例如:
function saySomething(message)
{
var msg = typeof message != 'string' ? 'Hello world!' : message; //setting default message
alert(msg);
}
当“load”事件发生时,它以这种方式调用函数:“saySomething(event)”-第一个参数是事件对象。不是一串
因此,您必须更改代码中的某些内容。例如:
function saySomething(message)
{
var msg = typeof message != 'string' ? 'Hello world!' : message; //setting default message
alert(msg);
}
这是因为您将此函数添加为事件侦听器。事件侦听器函数的第一个参数是事件对象。这就是您获得[对象事件]
的原因
您可以将消息绑定到上下文对象。这是解决问题的一种方法:
function saySomething(message) {
alert(message);
}
function saySomethingListener(message) {
saySomething(this.message);
}
saySomething('Hello world!');
function addLoadListener(fn) {
window.addEventListener('load', fn.bind({message: 'Hello world!'}), false);
alert("the previous alert came from onload");
}
addLoadListener(saySomethingListener);
这是因为您将此函数添加为事件侦听器。事件侦听器函数的第一个参数是事件对象。这就是您获得[对象事件]
的原因
您可以将消息绑定到上下文对象。这是解决问题的一种方法:
function saySomething(message) {
alert(message);
}
function saySomethingListener(message) {
saySomething(this.message);
}
saySomething('Hello world!');
function addLoadListener(fn) {
window.addEventListener('load', fn.bind({message: 'Hello world!'}), false);
alert("the previous alert came from onload");
}
addLoadListener(saySomethingListener);
试试小提琴,一切都很好@PratikJoshi谢谢Patrick,但我看不到另一个你好世界代码>页面加载后。如果你能解释一下为什么会发生这种情况,那也太好了。Thanks@PratikJoshi您必须将JSFIDLE的加载机制从onLoad
更改为No wrap-in
,因为您可以看到,您将函数添加到事件侦听器时没有任何参数,所以为什么