getting-started-with-javascript icon indicating copy to clipboard operation
getting-started-with-javascript copied to clipboard

实际编写Javascript函数当中使用思路的疑问

Open ding-git opened this issue 6 years ago • 1 comments

学习完第四课之后,结合「JavaScript权威指南」中对于闭包的介绍,我尝试着做了同一个Demo的两种实现。

Demo目的相对简单,使用设定好的一个数字100,每次执行一个函数累加1000。

方法1,使用全局变量以及两个函数方式实现

var setPlusNum = 0;
var resultNum = 0;

function setPlusNum(inputNum){
	setPlusNum = inputNum
}

function getPlusNum(inputNum){
	resultNum = resultNum + inputNum;
    console.log('Result to ' + (resultNum+setPlusNum)  + '.');
}

setPlusNum(100); 

getPlusNum(1000);  //Result to 1100.
getPlusNum(1000);  //Result to 2100.

方法2,使用函数闭包和柯里化实现


function setPlusNum(inputNum) {
  var num = inputNum;
  return function (inputNum) {
    console.log('Result to ' + (num += inputNum) + '.');
  }
}

var getPlusNum = setPlusNum(100); 
getPlusNum(1000);  //Result to 1100.
getPlusNum(1000);  //Result to 2100.

发现2种方法都可行,藉由这个引发思考的问题:

疑问1,从结果来分析,使用方法2柯里化方式代码量更少,但是相对阅读上似乎就困难一些,在小型多人协作团队中,是否应当去优先使用?

疑问2,我理解闭包的优点是让变量私有化,避免全局的污染,但缺点是会占用更多内存,那么现在一般在实际项目中多占用的内存通常会不会成为需要考虑的问题呢?

ding-git avatar Aug 17 '17 16:08 ding-git

这个问题锁定在两种实现方案的对比上。

  1. 不要用代码量大小来衡量好坏。易读但是代码量大,不是好事。难度但代码量小,也不是好事。我们只判断是否是最优的方案。只要是最优,是不是多人协作都无关系。
  2. 你写出了闭包的特点。但是闭包可以让计算延后,你return了一个函数,这个函数就可以延后计算(好好理解这个)。
  3. 只要是符合项目需求,使用闭包的手段不用考虑内存问题。除非你把一个非常非常非常大的对象内置到了闭包里。

xugy0926 avatar Aug 18 '17 16:08 xugy0926