欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内存数据变量&&回调函数&&IIFE匿名函数

程序员文章站 2022-03-08 23:31:40
...

内存&&变量&&数据

内存

内存分类

​ 栈:全局变量/局部变量(函数名在栈空间

​ 堆:对象(函数本身在堆空间

小内存的两个数据

​ 内部储存的数据and地址值

var obj = {name:"Jack"};
var a = obj;

数据

数据的特点:可传递,可运算

内存中所有操作的目标:数据(算术运算 逻辑运算 赋值 运行函数)

变量

​ 可变化的量,变量名和变量值组成

​ 每个变量对应一小块内存,变量名用来查找对应的内存,变量值就是内存中对应的数据

三者之间的关系

内存是用来存储数据的空间;

变量是内存的标识

相关问题

  1. 赋值和内存问题:var a = xx ,a保存的是什么?

    | xx是基本数据,保存的就是数据

    | xx是对象,保存的是对象的地址

    | xx是变量,保存的是内存内容(数据or地址)

  2. 引用变量和赋值问题

    |多个引用变量指向同一个对象,一个变量修改对象内部数据,另外的变量访问的也是修改后的数据

    //这里其实有三个引用变量指向同一个对象 obj1 obj2还有obj(形参)修改其中一个另外的也会被修改
    var obj1 = {name:"Tom"}
    var obj2 = obj1
    obj2.age = 18
    console.log(obj1.age)  //18
    function fn(obj){
        obj.name = Jack
        // 注意!!!  obj = {name:"Jack"}  若改为此种写法 -> 则输出为Tom  因为相当于赋值了一个新的对象,obj指向了新的地址(本来是obj1的地址),函数执行完变成了垃圾数据被释放,obj1还是指向原来的对象
    }
    fn(obj1)
    console.log(obj2.name)  //Jack
    

    |2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个变量

    var a = {age:12}
    var b = a
    a = {name:'BOB',age:13}  //a指向新的变量
    console.log(b.age,a.name,a.age)//12 BOB 13
    

    对象&&回调函数

    对象

    ​ |多个函数的封装体,用来保存多个数据的容器

    ​ |对象可以更方便我们统一管理多个数据

    回调函数

    ​ |回调函数的概念:是自己定义的 ,没有调用但执行了

    ​ |常见回调函数:ajax请求回调函数 生命周期回调函数(暂时还没理解,正在看)

    ​ |回调函数:使用callback&&callback() 传递参数时,传或者不传回调函数都可以

    <button id = "btn">测试点击事件</button>
    
    <script type = text/javascript>
        document.getElementById('btn').onclick = function(){//dom事件回调函数
        alert(this.innerHTML)
    }
    
    setTimeout(function(){//定时器回调函数
        alert("时间到了")
    }2000)
    </script>
    

IIFE(匿名函数)

定义

​ 立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数

(functionlike(){
  var a=10;
  console.log(a);
})();

作用

​ |隐藏实现,不会污染全局命名空间

​ | JS只有全局作用域、函数作用域,只有function才能实现作用域隔离,如果要将一段代码中的变量、函数等的定义隔离出来,只能将这段代码封装到一个函数中。虽然大部分的函数封装都是为了复用,但也有只使用一次的函数 -> 为了隔离作用域。既然只使用一次,那么就可以立即执行并且省略函数的名字 -> IIFE

(function(){
        var a=1
        function test(){
            console.log(++a)
        }
        function test2(){ //被隐藏没有向外暴露,不可调用
            console.log(++a)
        }
        window.b = function(){  //向外暴露test这个函数
            return{
                test:test
            }
        }
    })()

	b().test() // b是一个函数,执行后返回一个对象
	//以下三种方式都会报错
    text()
    text2()
    b().text2()

this对象

|以函数形式调用时,this指向window

|以方法形式调用时,this就是调用方法的那个对象