`

javascript两种定义function的区别

阅读更多
大家都知道以下两种定义function的方式
 //定义function的第一种方式
        var fun1 = function() {
            alert("fun1");
        }
        //定义function的第二种方式
        function fun2() {
            alert("fun2");
        }

那我们平时使用,用哪种方式了?大多数情况推荐第一种方式,但是看看下面这种情况
<!DOCTYPE html>
<html>
  <head>
    <title>event.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script>
        window.onload = mychange;
        //此处用第一种方式,不能执行这个function
//        var mychange = function() {
//            alert("hi");
//            var ll = document.getElementsByTagName("li")
//            alert(ll.length);
//            for(var i=0,len=ll.length;i<len;i++) {
//                alert(ll[i].innerHTML);
//                ll[i].onclick = show;
//            }
//        }
        //用下面的方式,正常执行
      function mychange() {
            alert("hi");
            var ll = document.getElementsByTagName("li")
            alert(ll.length);
            for(var i=0,len=ll.length;i<len;i++) {
                alert(ll[i].innerHTML);
                ll[i].onclick = show;
            }
        }
        
        var show = function(event) {
            event = event||window.event;
            alert(event.type);
            alert("hello"+this.innerHTML);
        }
    </script>
  </head>
  
  <body>
   <ul>
       <li>apple</li>
    <li>pear</li>
    <li>orange</li>
   </ul>
  </body>
</html>

为什么发生了这种情况?我们添加以下代码:
        window.onload = mychange;
        alert(mychange);

这时窗口显示undefined!所以根本不可能往下执行。所以从这点可以分析出,javascript解释器是按前后顺序边解释边执行的。

那用第二种方式为什么可以?因为用第二种方式定义的function,会最先初始化,就类似于java中static属性。

看到这,新的问题来了,上面例子中的show方法,为什么没有问题?

因为调用mychange方式,是在window完成加载后才执行的,所以show已经初始化了,我们最后来看下顺序:
1、解释mychange方法
2、解释window.onload = mychange,发现调用的是onload方法,所以此处暂停,继续往下解释
3、解释var show 这段script,并加载window中的所有内容
4、加载完成,执行mychange方法
分享到:
评论

相关推荐

    javascript两种function的定义介绍及区别说明

    javascript两种function的定义方式function a(){}和a=function(){}具体使用如下,感兴趣的朋友可以参考下,希望对你对你学习function的定义有所帮助

    JavaScript中的函数的两种定义方式和函数变量赋值

    函数名当参数,传递给另一个函数 */ //==================js中函数的两种定义方式和函数变量赋值================ //在javascript中定义一个函数就可以理解成定义了一个变量 //js中的变量时弱类型的哦。 //———-1 ...

    JavaScript面向对象

    在JavaScript中定义JavaScript对象有两种方式: 方式一: var Book ={ getBookName:function(){ alert&#40;"获取书的名称"&#41; ; } }; 方式二 var oBook = function(){}; oBook.getBookName=...

    javascript 两种声明函数的方式的分析

    JavaScript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; /*方式二*/...

    javascript 面向对象function详解及实例代码

    javascript 面向对象function详解  js中的函数有三种表示方式: //函数的第一种表示方式:函数关键字的方式 function f1() { ... 函数的定义方式一般有以上三种,前两种方式基本没什么区别,第三种定义

    【JavaScript源代码】JavaScript中箭头函数与普通函数的区别详解.docx

    JavaScript中箭头函数...箭头函数有两种格式,一种只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return。 箭头函数是匿名函数,不能作为构造函数,不能使用n

    javascript 用函数语句和表达式定义函数的区别详解

    通常我们会看到以下两种定义函数的方式: 代码如下:// 函数语句function fn(str){ console.log(str);}; // 表达式定义var fnx=function(str){ console.log(str+ ‘ from fnx’);};以前都是凭借自己手指的感觉...

    深入浅析JavaScript中的Function类型

    Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念。 1. Function类型是js中引用类型之一,每个函数实际上都是... //两种方

    【JavaScript源代码】vue实现页面打印自动分页的两种方法.docx

    vue实现页面打印自动分页的两种方法  本文实例为大家分享了vue实现页面打印自动分页的具体代码,供大家参考,具体内容如下 一、通过ref方式获取元素进行打印 1.封装一个js文件 // 打印类属性、方法定义 /* ...

    JS类定义原型方法的两种实现的区别评论很多

    我们知道,给JavaScript类添加原形(prototype)方法是很简单的。而且常用的有下面这两种方法,可是这两种方法在使用时有区别吗? JScript Class: 代码如下: function...# re: JS类定义原型方法的两种实现的区别 

    JavaScript中定义对象原型的两种使用方法

    第一种: function Person() { this.username = new Array(); this.password = "123"; } Person.prototype.getInfo = function() { alert&#40;this.username + ", " + this.password&#41;; } var p = new Person();...

    javascript函数的解释

    68.JS中分为两种窗体输出:模态和非模态.window.showModaldialog(),window.showModeless() 69.状态栏文字的设置:window.status='文字',默认的状态栏文字设置:window.defaultStatus = '文字.'; 70.添加到收藏夹:...

    JS类中定义原型方法的两种实现的区别

    而且常用的有下面这两种方法,可是这两种方法在使用时有区别吗?  JScript Class:  function JSClass()  {  }  Extends prototype method:  JSClass.prototype.MethodA = function()  {  };  Or  ...

    JavaScript定义类和对象的方法

    JS定义一个类有两种定法(我只知道这两种): 1. 定义函数的方式: 定义: 代码如下:function classA(a) {  this.aaa=a; //添加一个属性  this.methodA=function(ppp) //添加一个方法  {  alert&#40;ppp&#41;...

    javascript学习笔记.docx

    2) 一个应用程序出现的每个窗口或框架都对应一个Window对象,而且都为客户端JavaScript代码定义了一个唯一的执行环境。 3) 脚本执行过程是Web浏览器的HTML解析过程的一部分。脚本按照它们的出现顺序执行。 4) 简单的...

    深入理解javascript中的立即执行函数(function(){…})()

    ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因...

    浅析javascript中函数声明和函数表达式的区别

    javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,...

    javascript面向对象之Javascript 继承

    在JavaScript中实现继承可以有多种方法,下面说两种常见的。 一,call 继承,先看代码: 先定义一个“人”类 代码如下: //人类 Person=function(){ this.name=”草泥马”; this.eat=function(){ alert&#40;“我要...

    JavaScript的递归之递归与循环示例介绍

    递归与循环 对于不同类型的需要重复计算的问题,循环和递归两种方法各有所长,能给出更直观简单的方案。另一方面,循环和递归的方法可以互相转换。任何一个循环的代码都可以用递归改写,实现相同的功能;反之亦然。...

Global site tag (gtag.js) - Google Analytics