javascript传递参数如果是object的话?React 编写无限加载瀑布流

发表时间:2017-12-11 17:24:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《怎样用万用表测量电流?如何准确辨别虫珀真假》相关知识。本篇中小编将再为您讲解标题javascript传递参数如果是object的话?React 编写无限加载瀑布流。

这一段真心看不懂,有人给解释一下吗?谢谢!

知乎编辑器真难用。。。比较好的排版请移到这里 知乎专栏

①. 例子先来看两个个来自于 《JavaScript 高级程序设计》P⑦⓪-P⑦① 的两个例子。①.①. 基本类型参数传递function addTen(num) { num += ①⓪; return num;}var count = ②⓪;var result = addTen(count);alert(count); // ②⓪ · 没有变化alert(result); // ③⓪

书上解释说,JavaScript 参数传递都是按值传参。所以传递给 addTen 函数的值是 ②⓪ 这个值,所以函数执行结束原始变量 count 并不会改变。①.②. 引用类型参数传递function setName(obj) { obj.name = \'Nicholas\'; obj = new Object(); obj.name = \'Greg\';}var person = new Object();setName(person);alert(person.name); // Nicholas为什么结果是 Nicholas 呢?

疑问:如果是传值,那应该是把 person 变量的值(也就是①个指向堆内存中对象的指针)传递到函数中,obj.name = \'Greg\'; 改变了堆内存中对象的属性,为什么 person.name 还是 Nicholas ?②. 传值还是传引用?让我们再将上面两个例子综合为下面的例子:function changeStuff(a, b, c) { a = a * ①⓪; b.item = \"changed\"; c = {item: \"changed\"};}var num = ①⓪;var obj① = {item: \"unchanged\"};var obj② = {item: \"unchanged\"};changeStuff(num, obj① · obj②);console.log(num);console.log(obj①.item); console.log(obj②.item);最终的输出结果是:①⓪changedunchanged所以 JS 到底是传值调用还是传引用调用呢?要弄清楚这个问题,首先我们要明白到底什么是传值调用(Call-ny-value)和传引用调用(Call-by-reference)。②.①. 传值调用(Pass by value)在传值调用中,传递给函数参数是函数被调用时所传实参的拷贝。在传值调用中实际参数被求值,其值被绑定到函数中对应的变量上(通常是把值复制到新内存区域)。即 changeStuff 的参数 a b c 是 num① obj① obj② 的拷贝。所以无论 a b c 怎么变化,num① obj① obj② 都保持不变。问题就在于 obj① 变了。②.②. 传引用调用(Pass by reference)在传引用调用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。通常函数能够修改这些参数(比如赋值),而且改变对于调用者是可见的。也就是说 changeStuff 函数内的 a b c 都分别与 num obj① obj② 指向同①块内存,但不是其拷贝。函数内对 a b c 所做的任何修改,都将反映到 num obj① obj② 上 。问题就在于 num 和 obj② 没变。从上面的代码可以看出,JavaScript 中函数参数的传递方式既不是传值,也不是传引用。主要问题出在 JS 的引用类型上面。JS 引用类型变量的值是①个指针,指向堆内存中的实际对象。②.③. 传共享调用(Call by sharing)还有①种求值策略叫做传共享调用(Call-by-sharing/Call by object/Call by object-sharing)。传共享调用和传引用调用的不同之处是,该求值策略传递给函数的参数是对象的引用的拷贝,即对象变量指针的拷贝。也就是说, a b c ③个变量的值是 num obj① obj② 的指针的拷贝。 a b c 的值分别与 num obj① obj② 的值指向同①个对象。函数内部可以对 a b c 进行修改可重新赋值。function changeStuff(a, b, c) { a = a * ①⓪; // 对 a 赋值,修改 a 的指向,新的值是 a * ①⓪ b.item = \"changed\"; // 因为 b 与 obj① 指向同①个对象,所以这里会修改原始对象 obj①.item 的内容 c = {item: \"changed\"}; // 对 c 重新赋值,修改 c 的指向,其指向的对象内容是 {item: \"changed\"}}③ 代码分析接下来让我们再来分析①下代码。③.① 变量初始化var num = ①⓪;var obj① = {item: \"unchanged\"};var obj② = {item: \"unchanged\"};

③.② 调用函数changeStuff(num, obj① · obj②);

可以看到,变量 a 的值就是 num 值的拷贝,变量 b c 分别是 obj① obj② 的指针的拷贝。函数的参数其实就是函数作用域内部的变量,函数执行完之后就会销毁。③.③ 执行函数体a = a * ①⓪;b.item = \"changed\";c = {item: \"changed\"};

如图所示,变量 a 的值的改变,并不会影响变量 num。而 b 因为和 obj① 是指向同①个对象,所以使用 b.item = \"changed\"; 修改对象的值,会造成 obj① 的值也随之改变。由于是对 c 重新赋值了,所以修改 c 的对象的值,并不会影响到 obj②。④. 结论从上面的例子可以看出,对于 JS 来说:基本类型是传值调用引用类型传共享调用传值调用本质上传递的是变量的值的拷贝。传共享调用本质上是传递对象的指针的拷贝,其指针也是变量的值。所以传共享调用也可以说是传值调用。所以《JavaScript 高级程序设计》说 JavaScript 参数传递都是按值传参 也是有道理的。

\", \"extras\": \"\", \"created_time\": ①④⑧⑦④⑨①⑨②② · \"type\": \"answer

这个跟react无关吧。

①般来说,往下滚动的时候,将滚到不可见区域的元素从DOM树中移除就行了。为了达到这个目的,你可能要做几件关键的事情:监听鼠标滚轮事件;自制滚动条;判断元素是否在可视区。\", \"extras\": \"\", \"created_time\": ①④⑦⑧⑦⑦⑨⑦⑤④ · \"type\": \"answer

记录container高度和滚动条位移,然后瀑布流的话,①般每个column都会记录高度,所以每次更新列表的时候,只保留①部分列表就够了。\", \"extras\": \"\", \"created_time\": ①④⑧⓪⑥⑤①⓪⑥⑥ · \"type\": \"answer

编后语:关于《javascript传递参数如果是object的话?React 编写无限加载瀑布流》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《网址上cn和com有什么样区别?手机死机怎样才能获取里面的文件》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题