老师,对于这样一个函数.两次调用fn后得到的返回值为什么不相等呢

老师,对于这样一个函数.两次调用fn后得到的返回值为什么不相等呢

相关截图:

http://img1.sycdn.imooc.com//climg/60b8528a097e0df806450460.jpg

http://img1.sycdn.imooc.com//climg/60b852bc0942e7d902200072.jpg

问题描述:

能详细解释下原理吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕久久 2021-06-03 15:08:11

同学你好,解答如下:

==前后,都是返回的fun这个函数(函数名、函数具体内容都是一样的),但是对应两个指针,两个地址。函数执行会开辟内存空间,执行几次就开辟几次;因此等号前后返回的fun处于不同的内存空间中(在不同的内存空间中,创建了两个一样的函数),是不同的对象,有不同的指针(只是长得一模一样,“长得一模一样”的意思就是函数名、函数内容一样)。或者可以这样理解:function fun(){}是声明一个函数,即创建一个函数;多次调用fn,每次调用,都会创建一个fun,多个fun之间是没有联系的:

http://img1.sycdn.imooc.com//climg/60b87f140999847508510338.jpg

这里和fn不同,fn==fn之所以是true,因为等号前后的fn是同一个:

http://img1.sycdn.imooc.com//climg/60b87ddc09df78f405380300.jpg

同学再理解一下。

祝学习愉快!

  • 提问者 __Promise #1

    总算理解了,给老师120个赞!

    2021-06-03 15:14:13
好帮手慕久久 2021-06-03 14:14:01

同学你好,解答如下:

js中有两种数据类型,一种是基本数据类型,比如数字;基本类型==比较时,比较的是“值”是否相等,如下:

http://img1.sycdn.imooc.com//climg/60b86f440948a55904870094.jpg

上图中,a和b的值都是1,所以a==b是true。

另一种是复杂类型,而函数就是复杂数据类型之一;复杂类型在==比较时,要比较是否是同一个对象(比较“址”),并不是比较“值”是否相等。同学的例子中,“==”前后都是函数,虽然长的一样(都是function fun(){}),但是在内存中,二者是独立存在的(内存中,对应着两个对象):

http://img1.sycdn.imooc.com//climg/60b86ff7094f374e07860222.jpg

http://img1.sycdn.imooc.com//climg/60b87089094a325a08320334.jpg

二者并不是同一个对象,因此==的结果为false。

同学可以回顾一下数组的==比较,函数和数组都是复杂类型,道理是一样的:

​https://class.imooc.com/lesson/1624#mid=38477(6分26秒)

祝学习愉快!

  • 提问者 __Promise #1

    老师,我一开始的理解是两次返回的既然都是名为fun的函数

    ​指针是一样的,那么应该都是引用内存上的同一函数,使用同一个地址

    (比如此时外部的fn==fn结果是true)

    实际上其实返回的是fun这个函数的具体值对吗?

    (也就是整个函数体function fun(){}?)

    而不是fun这个指针

    2021-06-03 14:30:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师