博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数多次调用返回的变量不是同一个
阅读量:4582 次
发布时间:2019-06-09

本文共 909 字,大约阅读时间需要 3 分钟。

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

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

总结下,就会发现:

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

仔细想想:

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

那么为什么,

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

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

仔细想想,可能是:

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

参考文档:

转载于:https://www.cnblogs.com/xianshenglu/p/8383418.html

你可能感兴趣的文章
chr()//ord() //进制转换函数//eval()//文件函数//split()
查看>>
第一章 Java程序设计概述
查看>>
定时调动 (项目保留备份代码码)
查看>>
Leetcode-Divide Two Integers
查看>>
HTML 首页倒三角形导航块
查看>>
每天一道Java题[9]
查看>>
结对编程2——单元测试
查看>>
python 函数/列表的应用
查看>>
C#与MES
查看>>
LR接口测试---Java Vuser之jdbc查询(调试前)
查看>>
SQL Server 各版本安装包分享
查看>>
.net项目移植后的虚拟目录的配置问题
查看>>
JSP页面中引入另一个JSP页面
查看>>
Android笔记——活动的生命周期
查看>>
springmvc使用包装的pojo接收商品信息的查询条件
查看>>
【Linux】【Services】【Configuration】puppet
查看>>
poj 1002:487-3279(水题,提高题 / hash)
查看>>
RAC环境上搭建DG
查看>>
OS X Mountain Lion高手进阶
查看>>
精通CSS:高级Web标准解决方案(第2版)(Amazon第一CSS畅销书全新改版)
查看>>