js函数知识

1、函数基本知识

通过函数可以封装任意条语句,在任何地方调用,js中用function关键字来声明,

        //基本格式,函数名,传递参数,代码块
        function functionName(arg0,arg1,arg2,……,argN){
             statements
        }

        //实例
        function sayHi(name,message){
              console.log("hello "+name+","+message)
        }
        sayHi("double","how are you")    //普通的函数名调用函数

        function sum(numb1,numb2){
             return numb1+numb2;
             console.log("find me ?")    //因为之前有return,所以不会再执行
        }
        var result=sum(1,2);             //声明变量的做法来调用函数

        function summ(numb1,numb2){
              return;                    //return可以不带任何返回值,这时候会返回undefined
              console.log("hello")
        }

        function diff(numb1,numb2){      //一个简单的比较函数
             if(numb1<numb2){
                  return numb2-numb1;
             }
             else{
                  return numb1-numb2;
             }
        }

1.1理解参数

js中的参数在其内部使用一个数组表示,所以无论参数的数据类型,个数都没关系,而且参数也不一定会用上的。

函数体内可以通过arguments对象访问到参数的数组,从而获得每一个参数。arguments对象和数组相似,可以中括号表示,有length;

参数名不是必须的,为了方便而已,也可以通过arguments[0]访问到

        function change(){
            console.log(arguments.length)
        }
        var zero=change()         //0      可以通过length来展现
        var one=change("one")     //1
        var two=change("two",2)   //2

        //没有参数名
        function doAdd(){
            if(arguments.length==1){
                console.log(arguments[0]+10);
            }else if(arguments.length==2){
                console.log(arguments[0]+arguments[1])
            }
        }
        doAdd(1)      //11
        doAdd(1,2)    //3

        //有参数名
        function anotherAdd(num1,num2){
            if(arguments.length==1){
                 console.log(num1+10);
            }else if(arguments.length==2){
                 console.log(num1+num2)
            }
        }
        anotherAdd(1)    //11
        anotherAdd(1,2)  //3

        function again(num1,num2){
            arguments[1]=10;
        //这里num2的值也就变成10,arguments的值与对应命名参数的值保持同步,内存空间还是独立的;没有传递值得命名参数为undefined
            console.log(arguments[0]+num2)
        }

1.2没有重载

所谓的没有重载就是说,不可以为函数两个定义,因为js的参数是数组,没有签名,做不到真正的重载。两个相同的函数则以后一个为准。

Function类型

也是引用类型,每个函数就是Function类型的实例,都与其他引用类型具有相同的属性和方法。函数为对象,所以函数名只是指向函数对象的指针

声明变量有两种方式。看例子吧。

      function sum(num1,num2){     //函数声明来定义函数
            return num1+num2
      }

      var sum=function(num1,num2){  //函数表达式定义函数
            return num1+num2
      }

      //函数名仅仅为指针;所以也能理解上面所说的函数没有重载
      function one(num1,num2){
           return num1+num2
      }
      var two=one
      var one=null
      console.log(two(1,2))    //3  即使one为null

函数声明和函数表达式之间的相爱相杀

解析器对他们两个态度可是不同的

对于函数声明,解析器会优先读取,对其有个函数声明提升的过程(function declaration hoisting)

对于函数表达式,解析器可就不会优先了,只有读取到其,才会被解释执行

      console.log(sum(1,2))        //3
      function sum(num1,num2){
            return num1+num2
      }

      console.log(another(1,2))    //another is not a function
      var another=function(num1,num2){
            return num1+num2
      }

当然还有构造函数法,不推荐使用,导致代码的二次解析,一次是常规js的,一次是构造函数的

也就是函数可以作为值传参

     function sum(someFunction,value){        //基本的函数中的嵌套
             return someFunction(value)
     }

     function multiplys(num){                 //内部的函数
            return num*num
     }

     console.log(sum(multiplys,2))            //调用函数,访问内部函数的指针,不需要()调用

利用作为值得函数,可以按照某一属性对数组进行排序

     function compare(value){                 //想要通过比较obj的属性,这里的value只是参数,没有被实例化;而在简单的数组中都已经被实例化了
           return function(obj1,obj2){
              var value1=obj1[value]
              var value2=obj2[value]
              return value1-value2
           }
     }

     var data=[{name:"double",age:24},{name:"zom",age:23},{name:"mike",age:32}]
     data.sort(compare("age"))
     console.log(data)         //23,,24,32来排序

2、函数内部的属性

在函数的内部,一般有两个对象

this对象:this引用的是函数执行的环境对象,即this值(在全局环境中,this则代表的是window)

arguments对象:类数组对象,保存函数参数;有个callee属性,此属性是个指针,指向拥有arguments对象的函数

ES5规定了另个一个函数对象的属性caller,保存着调用当前函数的函数引用,在全局作用域中调用当前函数则为null

     //递归函数
     function sum(num){
          if(num<=1){
              return 1
          }
          else{
              return num*arguments.callee(num-1)     //消除紧紧耦合,保证完成递归函数,所以用callee属性
          }
     }
     var summ=sum;
     sum=null
     console.log(summ(10))

    //this
    window.color="red"

    function sayColor(){
         console.log(this.color)
    }

    sayColor()                    //red

    var another={color:"blue"}
    another.putColor=sayColor     //函数名只是个指针
    another.putColor()            //blue

  //函数对象属性caller
  function outer(){
      inner()
  }
 /*  function inner(){
      console.log(inner.caller)
  }*/
  function inner(){
      console.log(arguments.callee.caller)    //减少耦合
  }
  outer()             //outer()函数

3、函数的属性和方法

每个函数有两个属性

length属性:表示函数的参数名个数

prototype属性:保存引用类型所有实例方法,不可枚举,用for-in无法实现

每个函数都包含两个非继承的方法;都是在特定的作用域中调用函数,实际等于设置函数体内this对象的值

apply()方法:接受两个参数,一为在其中运行函数的作用域,一为参数数组(Array的实例或者arguments对象)

call()方法:接受的第一个参数是this值没变化,第二个不是数组了,直接传递给参数即可,看例子吧

   function sum(num1,num2){
       return num1+num2
   }

   function oneSum(num1,num2){
       return sum.apply(this,arguments)         //arguments对象
   }
   function twoSum(num1,num2){
       return sum.apply(this,[num1,num2])       //数组
   }

   console.log(oneSum(1,2))
   console.log(twoSum(1,2))

   function three(num1,num2){
       return sum.call(this,num1,num2)          //参数直接传递
   }
   console.log(three(1,2,3))   

  //apply()和call()方法可以扩充函数的作用域
  window.color="red"
  var one={color:"red"}

  function sayColor(){
      console.log(this.color)
  }
  sayColor()                  //red

  sayColor.call(this)         //red
  sayColor.call(window)       //red
  sayColor.call(one)          //blue   这里的作用域为one中的了,不需要再将函数放到one中等操作

ES5规定还规定一个方法bind(),创建一个函数实例,其this值被绑定到传给bind()函数的值,

  window.color="red"
  var one={color:"blue"}

  function sayColor(){
      console.log(this.color)
  }

  var another=sayColor.bind(one)     //ES5的函数方法,创造一个函数实例了,并且绑定的this值传递给函数了
  another()                          //blue

原文地址:https://www.cnblogs.com/iDouble/p/8372468.html

时间: 2024-08-09 17:51:15

js函数知识的相关文章

js基础知识总结:函数

函数内部的属性: arguments 和this是函数内部的两个特殊对象 arguments: function recursion(num){ if(num<=1){ return 1; }else{ return num*recursion(num-1); } } 另一种写法: function recursion(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } arguments:表示当

学完了js的知识,一起分享总结知识点

又一个知识点学完了,到了总结学习效果和知识总结的时间了.js这个编程语言相对于html和css的逻辑性要强一些,也比较不容易上手.概念性的知识点不难理解,就是实际的操作并不容易,需要通过学习和借鉴案列来理解和帮助并提高实践操作的能力,把理论知识更好的结合到实践当中去,这样才能更有利于去理解和提高自己,做到知识的真正转化,缺乏理论概念性的支撑,有时真的很难上手,尤其是对于刚学习新手而言.所以需要总结知识点,大家可以互相分享一下学习的方式方法,知识总结,通过这种方式方法,相信可以有效的帮助解决一些学

JS基础知识回顾:引用类型(一)

在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起,而对象时引用类型的一个实例. 尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构,所以虽然说引用类型与类看起来想死,但他们并不是相同的概念. 不过引用类型有的时候也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法. 新对象是使用new操作符后跟一个构造函数来实现的,构造函数本身就是一个函数,只不过该函数时处于创建新对象的目的而定义的. ECMASc

JS 基础知识4 运算符

JS的运算符一般含有: 1 算术运算符 2 相等运算符 3 关系运算符 4 字符串运算符 5逻辑运算符 6位运算符 7 赋值运算符 首先看算术运算符,它一般有(+,-,*,/,%,++,--) 这里,%模运算符,其实也就是取余的意思,比如,5%2=1: 这里要特别说一下++,与--(这里只列了++,--是一样的道理). 1 var i = 1; 2 var j = ++i; //实际相当于 i+=1;j=i; 3 alert(i + " " + j); 4 5 var m = 1; 6

JS 基础知识2 传值和传址

要知道传址跟传址,首先我们先了解下数据值的操作. 1复制:可以把它赋值给一个新的变量 2传递:可以将他传递给一个函数或者方法 3比较:可以与另外一个值比较,判断是否相等 简要介绍下传值: 当一个数据是通过值被操作的,那么关系到的是数据的值,在赋值的过程中,是对实际值进行了COPY,储存在一个变量或者属性或数组中,copy的值与原数据是相互独立的. 当数据通过值传递给一个函数时,数据的一份传递给这个函数,如果函数体修改了这个值,只在函数体受影响,函数外的原数据不受影响. 当一个数据通过值和另外一个

JS 基础知识3 变量

变量和数值相关,它储存了那个值,有了变量就可以储存操作数据了. js与其他语言不同,它是非类型的.就是变量可以存放任何类型的值,而其他语言需要存放特定类型的值. var i=5; i="fdsfad"; 这是合法的. 变量的声明一般是由VAR 关键字声明的 var i,sum; //一次声明两个变量,   若变量没有给定初始值,则值为“undefined” 在JS中多次声明同一个变量,是不会出错的,仅仅是给变量赋值的性质. 还有一种,不用var关键字声明变量,则JS会隐式的声明该变量,

js函数大全

js函数集·字符串(String) 1.声明 var myString = new String("Every good boy does fine."); var myString = "Every good boy does fine."; 2.字符串连接 var myString = "Every " + "good boy " + "does fine."; var myString = "

JS基础知识回顾:ECMAScript的语法(一)

任何语言的核心都必然会描述这门语言最基本的工作原理,而描述的内容通常都要涉及这门语言的语法.操作符.数据类型.内置功能等用于构建复杂解决方案的基本概念. ECMAScript中的一切变量.函数名.操作符都区分大小写. ECMAScript的标识符要符合下列规则:第一个字符必须是字母.下划线或美元符号:其他字符可以是字母.下划线.美元符号或数字. 标识符中的字母也可以包含扩展的ASCII或Unicode字母字符,但是并不推荐. 按照惯例,ECMAScript标识符采用驼峰大小写的格式来书写,尽管没

JS基础知识回顾:引用类型(四)

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法. 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 函数的声明有以下三种形式: function sum(num1,num2){return num1+num2;}//利用函数声明语法定义 var sum=function(num1,num2){return num1+num2;}//利用函数表达式定义 var sum=new Function("num1","nu