js函数声明方式, 调用方法, 种类

455 阅读4分钟

概念: 在js中,函数就是个对象,函数名就是个指向函数对象的指针

1, js函数的三种声明方式

1.1, 函数声明, 函数表达式, 使用Fuction构造函数生成实例

  • 1,函数声明
    // 语法
   function sayName(name) {
    console.log(name)
   }
  • 2,函数表达式
  // 语法
  var  sayName = function(name){
    console.log(name)
  }
  • 3,使用Fuction构造函数生成实例
  // 前面都是函数参数,最后一个字符串参数表示函数体
  var sum = new Function("num1", "num2", "num1+num2")
  // 不推荐的原因:
  // 1. 需要两层解析,一是函数解析,二是对内部字符串的解析,耗性能
  // 1. 书写麻烦,函数体还不能写复杂

1.2, 函数声明和函数表达式的区别

  • 几个概念

    • 解析器,就是对js源码进行一定规则解析,然后交给执行环境执行

    • 执行环境,js源码真正运行的环境

    • js解析器的规则有点特殊,有两个提升(变量提升, 函数声明提升)

      • 变量提升: 源码中声明的变量会被被解析器提取出来,在源码逐行执行前被执行,此时变量会被赋值为undefined
      • 声明函数提升: 声明函数会被整体提升到代码执行前,所以在声明函数之前就调用该函数,是不会报错的,因为该函数已经被提升到执行环境的头部了
  • 区别

    • 函数表达式,只会提升它的变量,该变量为undefined,只有当代码执行该函数所在的位置时,该变量才会被真正指向该函,所以在函数表达式之前的调用,都会导致脚本报错
    • 声明函数会被提升,提前引用不会报错

1.3 函数的属性和方法

  • 内部属性this和arguments

    • this,表示调用函数的对象的引用
    • arguments,函数参数组合而成的类数组
  • 函数本身的属性和方法

    • length, 返回函数参数的个数
    • apply()、call()、bind(), 用于函数继承并修改内部this指向

2, js函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式

1, 方法调用模式

// , 请注意this此时指向myobject
    var myobject={
            value:0,
            inc:function(){
                    console.log(this.value) // 0
                }
        }
    myobject.inc()

2, 函数调用模式


// 请注意this此时指向window
    var add=function(a,b){
        console.log(this)//this被绑顶到window
        return a+b;
    }
    var sum=add(3,4);
    console.log(sum)

3, 构造器调用模式

JS是一门基于原型继承的语言,这意味着对象可以直接从其他对象继承属性
如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将绑定到那个新对象上
//  javascript语言精粹一书建议摒弃这中方式
    function Person(){
        this.name = "zhangsan";
        this.age = 19;
        this.sayHello = function(){
            console.log(1)
        };
    }
    var p = new Person(); 
    p.sayHello(); // 1

4, call(),apply()调用模式(上下文调用模式)

// apply的第一个参数就是this指针要指向的对象
    var myobject={};
    var sum = function(a,b){
        console.log(this)
        return a+b;
    };
    var sum2 = sum.call(myobject,10,30);
    //var sum2 = sum.apply(myobject,[10,30]);
    console.log(sum2);

3, js函数的种类(普通函数, 匿名函数, 闭包函数)

普通函数

// 普通函数示例
    function ShowName(name) {
      console.log(name);
    }
  • 1, Js中同名函数的覆盖只会调用后面的
  • 2, arguments对象
    function showNames(name) {
      console.log(name);//张三
      for (var i = 0; i < arguments.length; i++) {
        alert(arguments[i]);//张三、李四、王五
      }
    }
    showNames('张三','李四','王五');
  • 3若函数没有指明返回值,默认返回的是'undefined'
// 若函数没有指明返回值,默认返回的是'undefined'
    function showMsg() {
    }
    console.log(showMsg());//输出:undefined

匿名函数

  • 1, 变量匿名函数(可以把函数赋值给变量、事件)

    • 说明: 变量匿名函数,左侧可以为变量、事件等
    • 适用场景: 避免函数名污染。若先声明个带名称的函数,再赋值给变量或事件,就造成了函数名的滥用
    var anonymousNormal = function (p1, p2) {
      console.log(p1+p2);
    }
    anonymousNormal(3,6);// 9
  • 2, 无名称匿名函数
    • 说明: 即在函数声明时,在后面紧跟参数。Js语法解析此函数时,里面代码立即执行
    • 适用场景: 只需执行一次的。如浏览器加载完,只需要执行一次且后面不执行的功能
    (function (p1) {
      console.log(p1);
    })(1); // 1

闭包函数

  • 定义:函数A内部声明了个函数B,函数B引用了函数B之外的变量,并且函数A的返回值为函数B的引用。那么函数B就是闭包函数

  • 适用场景: 保证函数funA内里的变量安全,因为外部不能直接访问funA的变量

    • 1, 全局引用与局部引用
    • 2, 有参闭包函数
    • 3, 父函数funA内的变量共享

4, js有7种数据类型

  • null, undefined, boolean, number, string, 引用类型(object、array、function), symbol