Javascript函数是按值传递的?

时间:2018-05-19 17:39:27

标签: javascript

我看到很多关于javascript对象和基元的文章和帖子通过refference传递和传递的值。虽然我没有看到涵盖功能的主题。它们是通过价值还是参考而传递的。因此我自己做了测试来检查出来。

Cosnider这个例子:



function sayHello() {
	console.log("Hello")
}

function changeSayHello(func) {
	func = function() {
		console.log("Good Bye");
	}
	func();
} 

sayHello();	// >>  Hello 
changeSayHello(sayHello); // >> Good Bye
sayHello(); // >>  Hello 




您可以通过运行代码段来查看结果。从这个例子中我得出结论,JavaScript中的functions是按值传递的。你有什么评论。

*编辑* 可能这更好地解释了我的想法。并且它表明函数是通过refference传递的?



var Obj  = function() {
	this.a = 5;
}

var change = function(func) {
	func.prototype.b = 8;
}

var first = new Obj();

console.log(first.b);	//undefined

change(Obj);

console.log(first.b);// 8




我不知道为什么这被标记为重复。我看到了建议的答案,并没有关于函数作为参数传递的示例。

2 个答案:

答案 0 :(得分:3)

您误解了引用在JavaScript中的工作原理。正确答案是所有在JavaScript中按值传递。只是有些值是引用。这意味着你永远不能这样做:

function changeX(x) {
    x = y
} 

并期望在函数外部更改x的值。 JavaScript就是不这样做。

函数是引用类型,您可以在其他地方阅读,但这不会影响赋值语义。您可能还想阅读:Is JavaScript a pass-by-reference or pass-by-value language?

答案 1 :(得分:1)

在Javascript中,可以使用任意数量的参数调用函数。这些参数可以是任何类型:数字,字符串,对象,数组,null,未定义...在函数签名中为接收的参数定义名称只是一种在内部访问它们并在函数中使用它们的方法。这些名称具有功能范围,仅存在于函数内,不在外部。你甚至可以传递比签名更多​​的参数。



let t = 5;
console.log("t = ",t);
let func = function(a,b){
  console.log(arguments); //array of arguments, to access unnamed ones
  a=17;
  if(typeof b ==="Object")
      b.hi = "Goodbye"; //in the second call below we use a Number
                    //no type guarantee anytime.
}
obj = {hi:"Hello"};
func(t,obj,3);
console.log("t = ",t); //unchanged by func
console.log(obj); // changed by func
func(1,2,3,4,5,6,7,8);




如上所述,复制了原始参数。对象实际上具有对复制的同一对象的引用。由于引用是针对同一个对象,因此实际对象是相同的,然后它的更改也可以在外部看到。

在一个函数中,你可以使用'参数'来访问它所调用的argmuents,这是一个参数数组。

function myFunc(){}

' myFunc的'是函数myFunc的引用,可以传递给其他函数。

不要与新的myFunc()'混淆它扩展了对象'并返回一个"实例"功能的不同,仅仅是对它的引用(并且会有不同的"这个"执行的上下文)。



function myFunc(a){
  this.b=5;
  this.a=a;
}

let f = new myFunc(6);

console.log(f.a,f.b);

function changeFunc(a){
  a.a=1;
  a.b=2;
}

changeFunc(f);

console.log(f.a,f.b);




因此,函数确实可以使用Javascript的上述特性更改另一个函数的字段。