zoukankan      html  css  js  c++  java
  • 函数多次调用返回的变量不是同一个

    学习函数的时候,总有个疑问,不明白,如图:

    function f(){    
        return function(){};
    }
    
    g=f();
    h=f();
    g===h;//false

    不仅仅如此,即使返回非匿名函数,也是不等的,比如:

    function f(){    
        return function x(){};
    }
    
    g=f();
    h=f();
    g===h;//false

    乍一看,似乎很正常,但是总是说不出来为什么,再拓展下:

    function f(){   
        let i={}; 
        return i;
    }
    
    g=f();
    h=f();
    g===h;//false

    那么好了,什么时候会出现相等呢?

    function f(){   
        let i=arguments.callee; 
        return i;
    }
    
    g=f();
    h=f();
    g===h;//true

    或者:

    let i={}; 
    function f(){       
        return i;
    }
    
    g=f();
    h=f();
    g===h;//true

    总结下,就会发现:

    当返回的变量是函数作用域之外声明的对象就会出现相等;

    仔细想想:

    因为任意两个对象都是不等的,除非引用的是同一个对象,才会出现相等;而且返回函数作用域之外声明的变量,实际上返回的只是一个引用,所以 当返回的变量是函数作用域之外声明的对象就会出现相等,上面的情况就能理解了 。

    那么为什么,

    返回函数作用域之内声明的对象就会不等呢?

    想当然的话好像的确应该是这样,但究竟是为什么呢?

    仔细想想,可能是:

    因为函数每次执行时,都创建一个执行环境,把活动对象作为变量对象添加到作用域链的前端,每次调用,就会执行一次代码,创建多次多个不同的变量,最后把相应变量在内存中的地址返回出来,然后执行环境销毁,保存在其中的所有其他变量和函数定义也随之销毁,所以每次返回出来的都是保存在内存中的一个新变量,所以如果是引用类型的,当然返回出来的都是不同的内存地址,对应不同的对象;

    参考文档:

    JavaScript高级程序设计-第3版-中

    JavaScript权威指南-第6版-中

  • 相关阅读:
    常见算法:C语言求最小公倍数和最大公约数三种算法
    java数据结构
    创建与删除索引
    Delphi 2007体验!
    wxWindows
    Android中WebView的相关使用
    IAR FOR ARM 各版本号,须要的大家能够收藏了
    [AngularJS] $interval
    [ES6] 10. Array Comprehensions
    [ES6] 09. Destructuring Assignment -- 2
  • 原文地址:https://www.cnblogs.com/xianshenglu/p/8383418.html
Copyright © 2011-2022 走看看