JS函数的4种调用方式

函数可以声明定义,也可以是一个表达式,
函数使用关键字function定义
函数被定义时,函数内部的代码不会执行
函数被调用时,函数内部的代码才会执行

函数有四种调用方式,每种方式的不同在于this的初始化。
(this是保留关键字,this指函数执行时的当前对象,this的值无法改变)

1、作为一个函数调用:直接调用函数

function abc(x,y) {
        return x * y;
    };
    // console.log(abc(5,6));
    console.log(window.abc(6,8));

2、作为方法来调用函数:将函数定义为对象的方法

    (last方法是一个函数,obj是函数的所有者)
var obj = {
        name:"yoe",
        age:22,
        last:function () {
            return this.name + " " + this.age;
        },
    };
    console.log(obj.last());
  //修改last方法,返回this值
    //函数作为方法调用,使this的值成为对象本身
    var obj = {
        name:"yoe",
        age:22,
        last:function () {
            return this;
        },
    };
    console.log(obj.last());

3、使用构造函数调用函数:(函数调用前使用new关键字)

	//构造器调用会创建新对象。新对象会从构造器中继承属性即方法
    //函数构造器
        function dee(a,b) {
            //构造器中的this没有值
            this.one = a;
            this.two = b;
        }
        //创建新的对象
        //this的值在调用对象时创建
        var obj = new dee("ele","vent");
        console.log(obj.two);

4、作为函数方法调用函数:(call和apply是预定义的函数)

call() 方法可以接收多个参数列表,
apply() 方法只能接收数组形式的参数,数组元素将作为参数列表传递给被调用的函数
两个方法的第一个参数必须是对象本身(也可以是null)
当第一个参数为null时,得到的是当前运行环境的全局变量(window)

//call()方法 函数名.call()
    function def(x,y) {
        return x + y;
    };
    var obj = console.log(def.call(obj,3,4));
    
 //apply()方法 函数名.apply()
   	  function def(x,y) {
          return x + y;
       };
       //var arr = [14,5];
       //var obj = console.log(def.apply(obj,arr));
       var obj = console.log(def.apply(obj,[14,6]));
apply、call、bind三者的区别:

相同:

  1. 都是用来改变函数的this对象的指向
  2. 第一个参数都是this要指向的对象
  3. 都可以利用后续参数传参

区别:

  1. apply、call、bind的第一个参数都是this要指向的对象,但apply只有两个参数,第二个参数为一个数组,需要传输的参数值全部放到数组中;call和bind的参数是用逗号隔开。
  2. apply和call返回的是一个值,bind返回的是一个函数
  3. bind是返回绑定this之后的函数,便于稍后调用,apply和call是立即调用

你可能感兴趣的:(js)