JS中函数的参数是按值传递还是按引用传递

JavaScript022

JS中函数的参数是按值传递还是按引用传递,第1张

JS求值策略有诸多争议和不同版本。对于这个问题的答案:“JS中基本类型是按值传递的,对象类型是按共享传递的。”共享传递解释为:(callbysharing,也叫按对象传递、按对象共享传递)。最早由BarbaraLiskov.在1974年的GLU语言中提出。该求值策略被用于Python、Java、Ruby、JS等多种语言。你可以自己写个demo运行下结果就知道。var a = 1function foo(x) {x = 2}foo(a)console.log(a)// 仍为1, 未受x = 2赋值所影响var obj = {x : 1}function foo(o) {o.x = 3}foo(obj)console.log(obj.x)// 3, 被修改了!

JavaScript 函数参数传递到底是值传递还是引用传递

一 参数

1 所有的参数传递,都是传递值的拷贝。(如果想知道为什么,去学习编译原理的函数调用的参数压栈和出栈对应内容)。

2 C传指针进去,其实也是把这个指针值按拷贝传送进去。但是因为指针值指向一块外部内存空间(其实更多是堆空间,或外层栈变量空间),所以感觉可以在函数里改变外部变量。其实本质还是按拷贝传递,只是传递进去的是一个访问变量的渠道。

因此,如果我们希望函数内能改变外部的指针值,往往传进去的是指针变量的指针。呵呵,很多初学C的程序员,对**非常难理解。

二 返回值

返回值是按拷贝传递,函数出栈后,会传出一个值,该值在调用函数的代码段的生命周期里一直有效。相当与调用点形成一个匿名的栈变量。

变量a = function() 而a并不等于函数里return的那个值。

其实function()执行结果自身就是一个匿名变量。(其实编译器会检查语法,如上面a=function这样的语法,匿名变量不会生成,直接使用a变量拷贝返回值)

例如: function()返回int值。 完全可以 int x = function() + 6//注意:+运算时,函数已经执行完毕,所有函数出栈操作已经结束。

很明显function()必须有一个变量或常量参与计算,而函数里return的值会随函数调用结束出栈而被删除,所以必须拷贝构造传递出来。

把参数写在括号里面 就可以了

var  a=1

var b=2

var c= myaddfun(a,b)

alert(c)

function my addfun(a,b){  //注意 这里的 a 和b 

                            // 和上表面的a和b 无关 可以用任何合法的变量名 如C和D

    return a+b

}

functions myaddfun(c,d){ //  用c和d也是一样, 只跟次序有关系

    return c+d 

}