Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript函数的执行顺序_Javascript_Jquery - Fatal编程技术网

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

为了更好地理解JavaScript,我回到了基础。我有一个测试网站。这是我的密码

<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
,因为您可以看到,您将函数添加到事件侦听器时没有任何参数,所以为什么