加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

JavaScript是如何工作的:JavaScript的共享传递和按值传递

发布时间:2019-04-18 23:29:08 所属栏目:建站 来源:前端小智
导读:关于JavaScript怎样将值转达给函数,在互联网上有许多误解和争论。大抵以为,参数为原始数据类时行使按值转达,参数为数组、工具和函数等数据范例行使引用转达。 按值转达 和 引用转达参数 首要区别简朴可以说: 按值转达:在函数内里改变转达的值不会影响

用汇编代码暗示:

  1. n -> 0x002233  
  2. Heap: Stack:  
  3. 002254 012222  
  4. ... 012223 0x002233  
  5. 002240 012224  
  6. 002239 012225  
  7. 002238  
  8. 002237  
  9. 002236  
  10. 002235  
  11. 002234  
  12. 002233 { number: 90 }  
  13. 002232  
  14. 002231 { number: 30 }  
  15. Code:  
  16. ...  
  17. 000233 main: // entry point  
  18. 000234 push n // n 值为 002233 ,它指向堆中存放 {number: 90} 地点。 n 被推到仓库的 0x12223 处.  
  19. 000235 ; // 生涯全部寄存器  
  20. ...  
  21. 000239 call sum ; // 跳转到内存中的`sum`函数  
  22. 000240  
  23. ...  
  24. 000270 sum:  
  25. 000271 ; // 建设工具 {number: 30} 内涵地点主 0x002231  
  26. 000271 mov 0x002231, (ebp+4) ; // 将内存地点为 0x002231 中 {number: 30} 移动到仓库 (ebp+4)。(ebp+4)是地点 0x12223 ,即 n 地址地点也是工具 {number: 90} 在堆中的位置。这里,仓库位置被值 0x002231 包围。此刻,num1 指向另一个内存地点。 
  27. 000272 ; // 整理仓库  
  28. ...  
  29. 000275 ret ; // 回到挪用者地址的位置(000240)  

我们在这里看到变量n生涯了指向堆中其值的内存地点。 在sum 函数执行时,参数被推送到仓库,由 sum 函数吸取。

sum 函数建设另一个工具 {number:30},它存储在另一个内存地点 002231 中,并将其放在仓库的参数位置。 将前面仓库上的参数位置的工具 {number:90} 的内存地点替代为新建设的工具 {number:30} 的内存地点。

这使得 n 保持稳固。因此,复制引用计策是正确的。变量 n 被推入仓库,从而在 sum 执行时成为 n 的副本。

此语句 num1 = {number:30} 在堆中建设了一个新工具,并将新工具的内存地点分派给参数 num1。 留意,在 num1 指向 n 之前,让我们举办测试以验证:

  1. // example1.js  
  2. let n = { number: 90 }  
  3. function sum(num1) {  
  4. log(num1 === n)  
  5. num1 = { number: 30 }  
  6. log(num1 === n)  
  7. }  
  8. sum(n)  
  9. $ node example1  
  10. true  
  11. false  

是的,我们是对的。就像我们在汇编代码中看到的那样。最初,num1 引用与 n 沟通的内存地点,由于n被推入仓库。

然后在建设工具之后,将 num1 从头分派到工具实例的内存地点。

让我们进一步修改我们的例子1:

  1. function sum(num1) {  
  2. num1.number = 30  
  3. }  
  4. let n = { number: 90 }  
  5. sum(n)  
  6. // n 成为了 { number: 30 }  

这将具有与前一个险些沟通的内存模子和汇编说话。这里只有几件事不太一样。在 sum 函数实现中,没有新的工具建设,该参数受到直接影响。

  1. ...  
  2. 000270 sum:  
  3. 000271 mov (ebp+4), eax ; // 将参数值复制到 eax 寄存器。eax 此刻为 0x002233  
  4. 000271 mov 30, [eax]; // 将 30 移动到 eax 指向的地点  

num1 是(ebp+4),包括 n 的地点。值被复制到 eax 中,30 被复制到 eax 指向的内存中。任何寄存器上的花括号 [] 都汇报 CPU 不要行使寄存器中找到的值,而是获取与其值对应的内存地点号的值。因此,检索 0x002233 的 {number: 90} 值。

看看这样的谜底:

原始数据范例按值转达,工具通过引用的副本转达。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读