2 ms·
This is exactly the problem I've been talking about. A compiler design lecture about implementing a JavaScript engine should not use the term "pass by value" t
by Stratoscope 9y ago
This is exactly the problem I've been talking about.
A compiler design lecture about implementing a JavaScript engine should not use the term "pass by value" to describe JavaScript's behavior.
Most JavaScript engines to date have been written in C/C++. Function parameters are passed by value in these languages, unless you use a reference parameter in C++.
This means that if the argument is a struct, the function receives a copy of the struct, not a reference to the original struct that was passed in.
Consider this C code:
typedef struct {
int bar;
} Foo;
void fun( Foo boo ) {
boo.bar = 43;
}
int main() {
Foo foo;
foo.bar = 42;
printf( "Before call: %d\n", foo.bar );
fun( foo );
printf( "After call: %d\n", foo.bar );
return 0;
}
This will print:
Before call: 42
After call: 42
fun() is passed a copy of the struct, so modifying the struct inside the function only affects its local copy. That's what "pass by value" means in C.
Compare with the similar JavaScript:
function fun( boo ) {
boo.bar = 43;
}
function main() {
let foo = { bar: 42 }
console.log( "Before call:", foo.bar );
fun( foo );
console.log( "After call:", foo.bar );
}
main();
This will log:
Before call: 42
After call: 43
The function doesn't receive a copy of the object, it receives the object itself, under a new name.
Using the term "pass by value" for JavaScript's behavior would only invite confusion.
- pjmlp 9y agoYou are doing pass by value on JavaScript example. For it to be pass by reference you need to change boo inside fun(), but you are changing a field of boo.bar using the boo address passed by value. When JavaScript starts having pass by reference, this code will hold true. Until then it won't, regardless how people re-invent CS concepts on HN. function fun( boo ) { boo = { bar: 42 } } function main() { let foo = null; console.log( "Before call:", foo); fun( foo ); console.log( "After call:", foo ); } main(); This will log: Before call: null After call: { bar: 42 }