【问题标题】:Function callbacks/copies, concept of passing by value/reference [duplicate]函数回调/副本,按值/引用传递的概念[重复]
【发布时间】:2020-01-12 16:19:32
【问题描述】:

我正在复习一些基本的 CS 理解,但问题出现了;/ 在我的脑海中。

我想知道是否有在“函数”上按值或引用传递的想法

函数是 JavaScript 的基本构建块之一。一种 function 是一个 JavaScript 过程——一组执行 任务或计算一个值。 -引自 developer.mozilla

我目前的理解是在保存函数的时候比较慌张:我不明白函数是怎么传递的。

考虑到任何不是原始类型的东西都是 javascript 中的对象类型,代码块作为对函数名称的引用传递。但是,我也被告知

'Javascript总是按值传递所以改变变量的值 从不更改底层原语(字符串或数字)。'

所以它是按值传递的吗?还是参考?所以这是我尝试测试案例的尝试:

function example(){
console.log('hello');
}

这里的代码块'console.log('hello")'被保存到名为'example'的函数变量中

那么在

的情况下
var example2 = example;

我希望函数“example”作为值传递给“example2”

所以我试图通过测试来检验我的假设是否正确:

function original(){
    console.log('hello');
}
var Original = original;
original();
Original();

function original(){
    console.log('Hello');
}
original();
Original();

我真的希望结果是

hello
hello
Hello
Hello

但实际结果却是

Hello
Hello
Hello
Hello

我以为是通过引用传递的,但在阅读评论后我意识到这是吊装问题;

所以我跑了

var original = function(){
    console.log('hello');
}
var Original = original;
original();
Original();

original = function(){
    console.log('Hello');
}
original();
Original();

结果出来了

hello
hello
Hello
hello

【问题讨论】:

  • 您对original 的第二个定义会覆盖第一个。当 javascript 加载时,函数被移动到代码的顶部(这就是为什么即使从代码编辑器的角度来看它可能还没有“声明”,你也可以分配一个函数)。我不确定是否有一种机制可以将函数移到顶部,所以可能是一旦你得到hellooutputted 4次和一次Hello 4次,但我不知道是否有事情的顺序
  • 按值/引用传递仅适用于您调用函数时,它并不真正适用于您的代码。您只需将函数分配给不同的变量并尝试将新函数重新分配给旧名称。不过,您可能对这个问题感兴趣:Is JavaScript a pass-by-reference or pass-by-value language?
  • ECMAScript 总是按值传递,这可能是原始值或对对象的引用。

标签: javascript function pass-by-reference


【解决方案1】:

这是由于提升,当您使用函数声明时会发生这种情况。如果你使用 use 函数表达式,那么你所期望的将会发生:

var original = function(){
  console.log('hello');
};
var Original = original;
original.value = 5;
original();
Original();

original = function(){ // changes original to point to a new function (does not affect Original)
  console.log('Hello');
}
original();
Original();
console.log( Original.value );

【讨论】:

  • 哦,谢谢 :DI 刚才试了一下,结果是 -------- hello hello Hello hello ----------- 所以我猜函数被传递为值,没有影响到第 4 个 hello 是 'Hello'
  • @soohyeok 不,错误conclusion ;) 您正在重新分配original 变量,但Original 已经对原始original 函数有引用
  • @Icepickle 实际上,你们都是对的。 reference 按值传递 :)
  • @icepickle 哦,所以基本上它是在原件保存到位置 1 中的引用 原件具有指向位置 1 的指针,然后原件重新分配给位置 2 并且原件仍然具有指向位置 1 的指针?
  • @PatrickRoberts 这是一种说法^_^
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2013-12-02
相关资源
最近更新 更多