资讯专栏INFORMATION COLUMN

关于JavaScript 函数传参

CloudwiseAPM / 2829人阅读

摘要:最早由在年的语言中提出。该求值策略被用于等多种语言。该策略的重点是调用函数传参时,函数接受对象实参引用的副本既不是按值传递的对象副本,也不是按引用传递的隐式引用。它和按引用传递的不同在于在共享传递中对函数形参的赋值,不会影响实参的值。

周五晚上下班回家的路上,突然想到了 CommonJS 规范、Node.js 模块化等等各种东西,然后就想到了熟悉的 module.exports

大约很久之前看 seajs 的文档,文档强调,exports = {/**/} 这种写法是错误的!当时还是小白中的小白,只能一脸懵逼,为嘛不能啊?完全无法理解。

请看截图:

有没有看到最后的提示?可惜那时候的小白文蔺完全不知道这是什么鬼——更可能的是那会儿就没关注到这一块儿,毕竟新人,心浮气躁,就想五分钟学会 seajs 模块化开发。

后来摸爬滚打,js 知识相对扎实之后(鸣谢厚厚的红宝书《 JavaScript 高级程序设计》,前后读了三遍),我还是好歹懂了,但未能举一反三。

昨天晚上,再次冒出这个问题,还是了然的。

子曰: 学而不思则罔,思而不学则殆。

很显然,exportsdefine(function(require, exports) {})中就是个局部变量,它对应的值是个对象,是 module.exports 的一个引用。

然后呢,一句exports = {/**/}就把这个局部变量指向另外一个值了。这是局部变量啊喂。卒。

很多新人看了一些博客或者书之后,脑子里也打结了,求值策略按值传递按引用传递,这些似是而非的概念最后都把人给整糊涂了。

刚刚刷SF,读到一篇文章,《JS中的值是按值传递,还是按引用传递呢?》,和我思考的有点类似。

然后搜索了下 “求值策略”,找到汤姆大叔的一篇文章,上文与大叔的这篇文章还挺类似的,但大叔的可能显得更深入一点。

下面是引用:

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

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

从科学的角度来说,对于概念什么的,可能还是挺有必要的。从实用角度来说,只要能正确理解,可能用自己的一套语言来描述也是可以的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79780.html

相关文章

  • 一个关于对象引用的bug引发的对于引用类型及数组的简单思考

    摘要:图示如下而对于引用类型的复制可不是这样这个复制只是将的引用赋值给,二者是属于同一个引用,访问的都是堆内存中的同一个对象,任何一个该引用的变量发生变化,会对其余使用该引用的变量也发生变化。 这两天自己在写代码的时候,出现一个BUG,代码如下: class Car { constructor(carId) { this.position =...

    lijinke666 评论0 收藏0
  • 彻底理解JavaScript中回调函数 (推荐)

    摘要:在中回调函数非常重要,它们几乎无处不在。首先你得先明白一点函数也是对象想弄明白回调函数,首先的清楚地明白函数的规则。理解了函数也是对象,先不急聊回调函数,先看看下面代码只写变量名返回的将会是方法本身,以字符串的形式表现出来。 在javascript中回调函数非常重要,它们几乎无处不在。像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是...

    RayKr 评论0 收藏0
  • 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 引言&前言

    摘要:我称之为轻量级函数式编程。序众所周知,我是一个函数式编程迷。函数式编程有很多种定义。本书是你开启函数式编程旅途的绝佳起点。事实上,已经有很多从头到尾正确的方式介绍函数式编程的书了。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 译者团队(排名不分先后):阿希、blueken、brucecham、...

    2bdenny 评论0 收藏0
  • JavaScript深入之bind的模拟实现

    摘要:也就是说当返回的函数作为构造函数的时候,时指定的值会失效,但传入的参数依然生效。构造函数效果的优化实现但是在这个写法中,我们直接将,我们直接修改的时候,也会直接修改函数的。 JavaScript深入系列第十一篇,通过bind函数的模拟实现,带大家真正了解bind的特性 bind 一句话介绍 bind: bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数...

    FingerLiu 评论0 收藏0
  • Date日期转换

    摘要:传入的格式要求详见日期格式打印结果作为构造函数作为构造函数可以通过指针实例化一个的实例对象,这个对象是一个日期对象。所有实例的属性和方法即是继承于构造函数原型上的属性和方法。 前言 之前写博客都是在github的搭建的个人博客上,最近开始迁移博客上的内容到segmentfalut。一方面是想重新整理下写过的博客。另一方面也是想与大家多多交流,找到现阶段自己的不足。第一篇文章是关于Dat...

    djfml 评论0 收藏0

发表评论

0条评论

CloudwiseAPM

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<