小课堂【js-03】

课题:JS有哪几种传参方式?

分享人:吴胜

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

什么是传参

  我今天要讲的是js基础传参:值传递、对象传递

概念

  在计算机科学里,按值传递(call by value)和按引用传递(call by reference)这个部分统称求值策略(Evaluation Strategy)。它决定函数调用时实参和形参之间值是如何传递的。

2.知识剖析

按值传递参数(最常用的求值策略)

函数的形参是被调用时所传实参的副本。
在函数中调用的参数是函数的参数。
如果函数修改参数的值,将不会修改参数的初始值(在函数外定义)。
函数参数的改变不会影响函数外部的变量(局部变量)。

通过对象传递参数

函数的形参接收实参的隐式引用,而不再是副本。
因此我们在函数内部修改对象的属性就会修改其初始的值。
修改对象属性可作用于函数外部(全局变量)。

3.常见问题

javascript是按值传递,还是按引用传递来传递参数?

4.解决方案

先看一串代码

var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x) // 仍然是1, obj并未被修改为100.;

从上面的代码可以看出,JavaScript中函数参数的传递方式既不是传值,也不是传引用,我们把它成为call-by-sharing(按共享传递)。

5.代码实战

6.拓展思考

什么是按共享传递 call by sharing?

  JS中的基本类型按值传递,对象类型按共享传递的(call by sharing,也叫按对象传递、按对象共享传递)。最早由Barbara Liskov. 在1974年的GLU语言中提出。该求值策略被用于Python、Java、Ruby、JS等多种语言。

   该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于: 在共享传递中对函数形参的赋值,不会影响实参的值。

如下面例子,不可以通过修改形参o的值,来修改obj的值。

var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.

不过,虽然引用是副本,但是引用的对象是相同的。它们共享相同的对象,所以修改形参对象的属性值,也会影响到实参的属性值。 如下面列子,通过修改形参对象o.x的值,来修改obj的值

var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!

7.参考文献

js基础之传参

8.更多讨论

js还有其他传参方式吗?

  函数之间的传参是没有了,不过js页面之间也有对应的传参方法。

js页面有几种传参方式?

一、URL;
二、H5 web storage;
三、Cookie;
四、Form 表单.

它们各有什么优点?

URL传参:取值方便,可以跨域;H5 Web storage:使用起来非常简单、方便;Cookie传参:兼容性最好,可以在同源内的任意网页内访问,生命期可以设置。

鸣谢

感谢大家观看

BY : 吴胜