函数基础知识回顾

回顾一下

  一 基本类型和引用类型

    1   五大基本类型:

  String    Number   Boolean   Null    undefined    //占有固定的内存大小,如数值型占八个字节,布尔类型占一个字节,他们的值  保存在栈空间,

     2  三大引用类型

   数组(array) 对象(Object) 函数(function)//引用类型占用空间内存不确定,但内存地址大小是固定的,存储的实际上是   数据的内存地址

      3   在变量复制时候,基本类型复制的是值本身,而引用类型复制的是地址

二 执行环境和作用域

   1   执行环境定义了变量或函数有权访问其他数据

      2   全局执行环境是最外围的执行环境,在web浏览器中,全局执行环境是window对象,全局变量的声明关键词为var ,也可不写

      3   内部环境可以访问到外部环境的变量和函数,但外部环境不能访问到内部环境的变量和函数

      4  访问局部变量要比访问全局变量快

  <script> 
   var name = "张三";      //定义全局变量
     alert(name)     //张三
     alert(window.name);    //全局变量,最外围,属于window属性
     var a={  
        setName: function (){ 
           return this.name;//undefinded  this指向a

        } 
 }
 
   alert(a.setName());
  </script>
  <script> 
 var name = "张三";      //定义全局变量
     alert(name)     
     alert(window.name);    //全局变量,最外围,属于window属性
     var a={  
        name:"李四",
        setName: function (){ 
           return name;//  张三     //直接访问全局变量name

        }
 }
 
   alert(a.setName()); 
 </script>
  <script> 
   var name = "张三";      //定义全局变量
     alert(name)     
     alert(window.name);    //全局变量,最外围,属于window属性
     var a={  
        name:"李四",
        setName: function (){ 
           return this .name;//  李四     this指向a

        }
 }
 
   alert(a.setName()); 
 </script>

下面再来体会几个作用域的例子

  <script>
    function setName(){ 
      var name="张三"  
      function setYear(){ //setYear()方法的作用域在setName()内 
          var age=21;
        var str=name+age+'岁了' ;
          return str;
      }  
      return setYear()
    }
    alert(setName()); //弹出 张三21岁了
  </script>

三 内存管理

      1. 内存分配:当我们申明变量、函数、对象的时候,系统会自动为他们分配内存

        2   分配和回收都是自动完成的,当内存不在使用时就会被回收,如当函数执行完之后,则会立即被回收

<script>
 // 为变量分配内存
    var m= 123;
    var n = "JavaScript";
// 为对象分配内存
    var person = {
        age: 25,
        name: '张三'
    };

    // 为函数分配内存
    function sum(m, n) {
        return m+n;
    }
 alert(sum(m,n)) 

</script>

四 函数作为参数的几种方式

              1.函数作为另一个函数的参数

    2 有参函数函数作为参数

<script >
//第一种函数作为另一个函数的参数
        function f(){
            alert("我是作为参数的函数")
        }
        function s(a){//此处啊作为形参,可以是任意值
            a();
        }
        s(f);
//第二种函数作为另一个函数的参数
       function people(){
           return 100
       }
       function sum(x,y){
           alert(x+y())
       }
       sum(10,people)

  //有参函数作为函数参数
      function fun(a){
          return a*a;
      }
      function ss(x,z){
          alert(x+z(x))
      }
      ss(100,fun)

</script>

 五 函数的内部属性

   1 arguments 本质上相当于一个集合,表示函数参数的一个集合

            2 使用arguments.length检测函数参数个数

<script >
  function sum(){
    alert(arguments.length)//检测参数个数
      result=0;
      for(var i=0;i<arguments.length;i++){
          result+=arguments[i]
      }
      return result;
  }//求参数和
  alert(sum(1,2))
  alert(sum(1,2,3,4));

</script> 
//内部属性具体举例
    <script>
        //在函数外部使用this,this就指的是window对象
        alert(this)
        //全局变量可以看做window对象的属性
        var x=1;
        alert(window.x)
        alert(this.x)
  </script>

        //函数内部调用
    <script>
      var x=1;
        function test(){
            var x=0;
            alert(x) //这里的x为0
            alert(this.x); //这里的x为1
            alert(this) //window对象
        }
        //test()
        //用new来调用,那么绑定的将是新创建的对象
        function test2(){ 
        this.x = 100; 
      } 
        var obj = new test2();//new改变this指向
        alert(x); //这里的x为1
        alert(obj.x);//这里的x为100
 </script>

        //作为某个对象的方法调用      

一  匿名函数

      定义:没有函数名字的函数

               1.单独的匿名函数是无法运行和调用的

     2. 可以把匿名函数赋值给变量

     3. 通过(匿名函数)()来执行

                4. 匿名函数传递参数(匿名函数)(参数)

接下来看一些小例子

<script >
    <!-- //普通函数 -->
    function people(){
      alert("我是一个好人")
    }
    people()

 //    //把参数赋值给一个变量
    
    var str=function(){
        alert("把函数赋值给一个变量")
    }
     alert(str)  //弹出函数体本身
     str()       //弹出结果


    // 匿名函数
     (function() {
         alert("你是一个坏人")
     })()


     //带参数的匿名函数
     (function(m,n) {
         alert(m+n)
     })(100,200)

</script>

这里提一下闭包,下节细讲

 二 闭包

   定义:闭包是指可以访问另一个函数作用域中的变量

   在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

   常见方式

   闭包的常见方式就是在一个函数中创建里另一个函数

   作用:通过闭包可以访问局部变量

             可以让局部变量始终保持在内存中

  <script>
  // 通过全局变量来累加
     var num= 100;
     function add() {
       alert(++num);
     }
      add();
      add();
      add(); // 每执行函数一次,累加一次;
  // 通过局部变量无法实现累加
    function add(){
      var num= 100; // 这里改为局部变量;
      alert(num++); 
    };
    add();add();add();  
  // 通过闭包实现局部变量的累加
  function add(){
      var num= 100; // 这里改为局部变量;
       return function(){
        num++;
        alert(num);
       }
    };    
   // add()();add()();add()();//这种调用方式会出错,因为每次调用 num都会初始化一次;
   var fn=add()//只在这里初始化一次,后边调用的时候执行的是里边的匿名函数
   fn();fn();fn();
   fn=null //应及时解除引用,否则会占用更多存
  </script>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java常量池解析与字符串intern简介

  在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构。 关于...

1002
来自专栏梧雨北辰的开发录

Swift学习:构造器(下)

本篇主要介绍Swift中构造器的一些特殊用法 一、可失败的构造器 顾名思义,这是用于我们构造过程可能失败情况的构造器。失败的原因可能是给构造器传入无效的参数值,...

2777
来自专栏老九学堂

稳准狠!最全讲解!初学者必看的C语言字符串知识

字符数组和普通数组一样,也是通过下标引用各个元素。 【示例】输出字符数组中的元素。

921
来自专栏专注数据中心高性能网络技术研发

[Effective Modern C++(11&14)]Chapter 3: Moving to Modern C++

2376
来自专栏web前端教室

javascript 红皮高程(20)-- 逻辑或

或,逻辑或邮二个竖线(||)表示,它需要二个操作数。 它的逻辑很好理解: 操作数1 操作数2 结果 true true tr...

1888
来自专栏编程

机器学习之Python基础(一)

标题 Python语言特点 基本数据类型 循环 文件IO 函数 1 1 1 Python是一种面向对象的解释型计算机程序设计语言。它有着代码简洁、可读性强的特点...

2028
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(一)——作用域链内存模型

几个概念 在开始之前,先了解几个概念。 1.1. 作用域 作用域是指当前正在执行的代码能够访问到变量的范围; 每个函数都有各自的作用域,存储函数所有的局部变量...

4778
来自专栏Java帮帮-微信公众号-技术文章全总结

Java企业面试——Java基础

1. Java基础部分 1.1 Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意思? 重载Overload表示同一个类中...

2864
来自专栏猿人谷

《C++ primer》--第1,2章小结

 1、变量初始化:  定义变量时,应该给变量赋初始值,除非确定将变量用于其他意图之前会覆盖这个初值。如果不能保证读取变量之前重置变量,就应该初始化变量。变量...

22010
来自专栏AI研习社

最常见的 35 个 Python 面试题及答案(2018 版)

作为一个 Python 新手,你必须熟悉基础知识。在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试。包括 Python ...

8073

扫码关注云+社区

领取腾讯云代金券