Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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中window.onload的混淆_Javascript - Fatal编程技术网

关于javascript中window.onload的混淆

关于javascript中window.onload的混淆,javascript,Javascript,我有一段javascript代码。我不太明白。 你能为我逐行解释一下吗?非常感谢 function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { oldonload(); func()

我有一段javascript代码。我不太明白。 你能为我逐行解释一下吗?非常感谢

 function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}
以下是我的想法:

 function addLoadEvent(func) { //define a function with a parameter 'func'
  var oldonload = window.onload; //assign window.onload event to variable oldonload
  if (typeof window.onload != 'function') { //if window.onload is not a function, then...
    window.onload = func; //assign 'func' to window.onload event. what does func mean?
  } else {             //if window.onlad is a function
    window.onload = function() {  //don't understand
      oldonload();  //call function oldonload()
      func();       //call function func()
    }
  }
}
困惑:

window.onload已经是一个事件,为什么要使用typeof

函数addLoadEvent(func),window.onload=func,func()。这些函数之间有什么区别

我很抱歉发布了一个新手问题。但是感谢给我一些指导的人

编辑:

这是Simon Willison改进的原始代码

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}
这很简单

检查是否已经注册了onload函数

如果没有的话, 1.将传递给onload的函数赋值为“func”

如果有,, 创建一个新的onload函数,该函数将:

  • 调用旧的onload函数
  • 打电话给你传递的“func”
  • 以及:

    window.onload已经是一个事件,并且 我们为什么使用typeof

    window.onload可以是一个函数,但如果没有设置,它将是“未定义”的。我们需要检查它的类型,看看它是什么

    函数addLoadEvent(func), window.onload=func,func()。什么 这些函数之间有什么区别

    函数是javascript中的一个变量。因此,您可以将该函数称为

    func

    你可以称之为

    func()

    在您的例子中:函数addLoadEvent(func)是当前的函数定义。它需要一个param,这个param应该是一个函数

    window.onload=func 将传入的函数分配给onload事件

    func()

    调用传入的函数

    以下是逐行更正:

    function addLoadEvent(func) { //define a new function called addLoadEvent which takes in one param which should be function
      var oldonload = window.onload; //assign window.onload event to variable oldonload
      if (typeof window.onload != 'function') { //if window.onload is not a function,  and thus has never been defined before elsewhere
        window.onload = func; //assign 'func' to window.onload event. set the function you passed in as the onload function
      } else {             //if window.onlad is a function - thus already defined, we dont want to overwrite it so we will..
        window.onload = function() {  //define a new onload function that does the following:
          oldonload();  //do whatever the old onload function did
          func();       //and then do whatever your new passed in function does
        }
      }
    }
    
    //then call it like this: 
    addLoadEvent(function() {
      alert("hi there");
    });
    addLoadEvent(function() {
      alert("this will be alerted after hi there");
    });
    //or like this:
    var fn = function(){
     alert("this will be the last thing alerted");
    };
    addLoadEvent(fn);
    
    你能为我逐行解释一下吗

    我太懒了,但简而言之:

    • 复制onload到另一个变量
    • 如果onload If函数,则将其设置为运行传递函数的新函数,然后设置为旧函数
    • 如果不是,只需使传递的函数在加载时运行即可
    window.onload=func//将“func”分配给window.onload事件。func是什么意思

    func是定义为函数(函数addLoadEvent(func))的第一个参数的变量。函数是JavaScript中的第一类对象——您可以像传递任何其他变量一样传递它们

    window.onload已经是一个事件,为什么要使用typeof

    这不是一个事件。它是一个可能是函数或未定义的属性。事件是导致该函数运行的“发生的事情”

    函数addLoadEvent(func),window.onload=func,func()。这些函数之间有什么区别

    第一个定义了一个名为addLoadEvent的函数。第二个函数将名为func的函数指定给onload。第三个调用名为func的函数


    作为旁白,不要用这个。使用或跨浏览器(如或)对其进行正常化的库。

    定义的函数
    addLoadEvent(func)
    旨在向现有的
    窗口添加附加函数。onLoad
    事件。因此,它要做的第一件事就是检查
    window.onLoad
    事件是否是而不是函数。如果不是,它只是将传入的函数分配给
    window.onLoad
    事件

    但是,如果已经定义了
    window.onload
    ,它将重置它以调用原始的
    onload
    函数以及您传入的函数(func)

    您可以使用它将自己的事件添加到“堆栈”:

    这会将匿名函数传递给addLoadEvent函数。这就是上面代码中的
    window.onload=function(){…}
    中发生的情况。您还可以预先定义函数并按如下方式传递:

    var myOnloadEvent = function() {
      alert('Hello! I run after the original window.onload event if it exists!');
    };
    
    addLoadEvent(myOnloadEvent);
    
    在javascript中,“函数”是一个变量可以采用的基本变量类型。Javascript也是松散类型的,因此变量的值取决于最后分配给它的内容。“事件”只是窗口对象的一个成员变量。因此,您可以将其分配给您喜欢的任何对象。如果它从未被分配给任何对象,它将在javascipt中接受“undefined”的原始值。因此,检查:

    if (typeof window.onload != 'function') {
    
    正在实际检查是否已定义window.onload事件处理程序

    如果尚未定义,则此函数将func分配给window.onload事件处理程序(即当窗口加载时将调用func)

    如果以前定义过,则此函数将创建一个新函数,在加载窗口时调用现有的onload处理程序,后跟func。本例还使用了javascript的一个名为“closure”的属性/语言特性,以便新定义的“compose”函数可以访问其作用域上方的变量,这些变量在外部函数失去作用域后仍然存在

    也许一个更有意义的检查是:

    if (typeof window.onload === 'undefined') {
    

    你能用代码逐行纠正我吗?我不太精通javascript。@非常感谢你,mkoryak。我只想确保第2行的“窗口。加载”。“窗口加载”的可能性是什么?因为David Dorward说过“这不是一个事件,它是一个属性,可能是函数,也可能是未定义的”。你怎么看?是的,他是对的。因为在JS中,所有函数也是变量/属性。如果未设置,则未定义。如果设置了,它可以是函数的类型。我们通常称之为“onload事件”,但实际上它是一个onload函数。semantics@myoryak,谢谢你的解释。现在我明白了window.onload也可以是一个字符串,当事件触发时将对其进行评估。这是Simon Willison在2004年最初编写的一些代码的旧版本:请注意,Simon在2006年更新了该代码以处理IE7上的潜在问题-您可能希望合并他的更新。感谢您提供的信息NickFitz。我已经查过了。谢谢大家的回复和解释。:)@David Dorward,非常感谢逐行更正。你是
    if (typeof window.onload === 'undefined') {