函数高级应用

 

 


 


一、函数定义方式

1.具名函数

function fn(){
console.log('this is a function')

2.匿名函数(函数表达式)

var fn = function(){
console.log('赋值表达式函数')
}

3.内置构造函数

var c = new Function("a", "b", "return a+b");
  console.log(c(2, 3));

二、函数的调用方式

1.函数名()

var a = function () {
    console.log("函数名()");
  }
  window.a();
  a();

2.自调用

var b = (function () {
    console.log("b");
  })();

3.call()调用

c.call();

4.对象中的函数调用

var d = {
    name: "d",
    play: function () {
      console.log(d)
    }
  }
  d.play();

5.数组中函数调用

var e = [
    function () {
      console.log(eeeee);
    }
  ];
  console.log(arr[0]);

6.函数作为参数的调用

function f(ff) {
    ff();
  }
  f(function () { console.log(“ffff”)});

7.函数作为返回值的调用

function g() {
    return function () { console.log("ggggg") }
  }
  g()();

三、改变this的指向的方法

1.call()

 1.调用函数

   

 function a() {
        console.log(111);
      }
      a();
      a.call();
      //打印效果等同

     2.call会改变this的指向,分两种情况,一种是没有参数,一种是有一个参数

    

 //没有参数,this指向window,打印“我叫狗”
      var Cat = {
        name: "猫",
        callName: function () {
          console.log("我叫" + this.name);
        },
      };
      var name = "狗";
      Cat.callName.call();
      //有参数,this指向参数,打印“我叫狗”
      var cat = {
        name: "猫",
        callName: function () {
          console.log("我叫" + this.name);
        },
      };
      var dog = {
        name: "狗",
      };
      cat.callName.call(dog);

     3. call会改变this的指向,有多个参数,this指向第一个参数,剩下的是个参数列表
 

2.apply()

   和call()只有最后一点有区别,只有两个参数,第一个是this,第二个是个参数的数组

3.bind()

  1.不能调用函数,返回值是个函数,要.band()()才能调用

四.arguments

任何一个对象都有内置函数arguments,他是个伪数组

1.arguments里面存的是传入函数的实参,跟形参有多少个没关系。

2.length:实参的个数

3.callee.length:形参的个数

4.callee.name:函数名

5.函数名.caller:函数的调用者(不常用)

五.作用域及作用域链

1.作用域分为全局作用域和局部作用域,函数里的作用域就是局部作用域,函数外的作用域就是全局作用域。

2.作用域链就是指从局部作用域到全局作用域的这条链。比如一个变量在函数中被用到了,他要找到这个变量才能使用,代码才能继续执行,他会先在函数中找这个变量的声明,如果没有就去全局里面找。就是这样的一个链。

六.闭包

闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。作用就是用来“锁值”,这么说肯定不好理解,还是靠实例说话。

  function getRandom(min, max) {
    var num = Math.floor(Math.random() * (max - min) + min);
    console.log("num:" + num);
    // 闭包
    return function () {
      console.log(num);
    };
  }
  var result = getRandom(1, 10);
  result();
  result();

虽然函数里面打印的是个随机数,但两次result()的结果相同,因为result接收了返回的function,加了个小括号执行了这个函数,根据作用域链,本身函数里没num去上一级函数里找,找到num,并打印,执行的是返回的函数,此时num已经固定不会改变,这就说明了闭包“锁值”的能力。

七.递归

一句话,函数自己调用自己完成一个功能,就是递归。

三步走:1.找规律

               2.写规律

               3.写临界情况

举个例子:斐波那切数列

  function fei(n) {
    if (n == 1) {
      return 0;
    }
    if (n == 2) {
      return 1;
    }
    // console.log(111);
    return fei(n - 1) + fei(n - 2);
  }
  console.log(fei(7));

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值