zoukankan      html  css  js  c++  java
  • JS函数

      函数声明:javascript定义函数(声明函数)可以有2种方法:正常方法构造函数。其中正常方法中又分为两种巨不同的定义方法;

        正常方法:1、函数声明(全局的)   :function  sayA() {   alert("i am A");  }     

             2、函数表达式(局部的): var sayB = function() { alert("i am B"); } 

       区别:前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义,这可以使用全局的概念理解,因为前者是全局,在没有调用前已经被加载;Javascript 中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。

     第一种函数声明的方法默认是全局的.我们都知道全局成员不是编程的最佳实践,在没有通过明确所有者对象而直接调用的函数中,如sayA() ,将导致this的值成为默认对象(浏览器中的窗口)。

     实例:使用函数声明的方法定义一个函数:makeArry,

    <script type="text/javascript">
    function makeArray(arg1, arg2){
        return [ this, arg1, arg2 ];
    }
    </script>

    然后简单的调用makeArray('one''two');返回值:[ window, 'one', 'two' ];

    然后我们变相的修改下函数的声明:让我们现在创建一个简单的对象,使用 makeArray函数作为它的一个方法,我们将使用json的方式来声明一个对象,我们也来调用这个方法:

    var arrayMaker = {
        someProperty: 'some value here',
        make: makeArray
    };
     
    //调用
    arrayMaker.make('one', 'two');
    // 输出=> [ arrayMaker, 'one', 'two' ]
    //调用
    arrayMaker['make']('one', 'two');
    // 输出=> [ arrayMaker, 'one', 'two' ]

     看到这里的不同了吧,返回值:[ arrayMaker, 'one', 'two' ];this的值变成了对象本身.你可能会疑问原始的函数定义并没有改变,为何它不是window了呢.好吧,这就是函数在JSavacript中传递的方式,函数在JavaScript里是一个标准的数据类型,确切的说是一个对象.你可以传递它们或者复制他们.就好像整个函数连带参数列表和函数体都被复制,且被分配给了 arrayMaker里的属性make,那就好像这样定义一个 arrayMaker:

    var arrayMaker = {
        someProperty: 'some value here',
        make: function (arg1, arg2) {
            return [ this, arg1, arg2 ];
        }
    };

       构造函数:  var add = new Function('a','b','return a+b;');这种方法作为我来说不常用,本人也没有这么多精力深入研究JS。

     JS的函数声明搞定了,接下来看看JS的调用:来源:leejersey

        1、方法调用模式

    /*方法调用模式*/
    var myobject={
        value:0,
        inc:function(){
        alert(this.value)
            }
     }
        
    myobject.inc()
    
    //请注意this此时指向myobject。

      2、函数调用模式

    /*函数调用模式*/
    var add=function(a,b){
            alert(this)//this被绑顶到window
            return a+b;
            }
    var sum=add(3,4);
    alert(sum)
    
    //请注意this此时指向window

     3、构造器调用模式

    /*构造器调用模式  摒弃*/
     var quo=function(string){
       this.status=string;
            }
     quo.prototype.get_status=function(){
       return this.status;
            }
     var qq=new quo("aaa");
     alert(qq.get_status());

     4、 apply调用模式 原文没看懂就搜素了另一篇介绍apply的内容。这里也不是我研究的重点,忽略!

  • 相关阅读:
    解决:npm中 下载速度慢 和(无法将“nrm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次)。
    maven(一) maven到底是个啥玩意~
    Luogu3959 NOIP2017宝藏(状压dp)
    Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)
    Luogu3952 NOIP2017时间复杂度
    BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
    BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)
    BZOJ4105 THUSC2015平方运算(线段树)
    BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)
    Luogu3731 HAOI2017新型城市化(二分图匹配+强连通分量)
  • 原文地址:https://www.cnblogs.com/java-oracle/p/6151636.html
Copyright © 2011-2022 走看看