【发布时间】: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次和一次Hello4次,但我不知道是否有事情的顺序 -
按值/引用传递仅适用于您调用函数时,它并不真正适用于您的代码。您只需将函数分配给不同的变量并尝试将新函数重新分配给旧名称。不过,您可能对这个问题感兴趣:Is JavaScript a pass-by-reference or pass-by-value language?
-
ECMAScript 总是按值传递,这可能是原始值或对对象的引用。
标签: javascript function pass-by-reference