使用变量而不是参数:一个不好的做法?

时间:2016-03-13 02:52:10

标签: javascript

假设我们有两个按钮,一个用于“早上”,另一个用于“晚上”,我希望console.log“早上好”或“晚上好”,具体取决于点击的按钮。这是我在学习Javascript之前用来做的方式:

var greeting;

//"d3.select" is just a selection using D3
d3.select("#button1").on("click", function(){
    greeting = "morning";
    hello();
});

d3.select("#button2").on("click", function(){
    greeting = "evening";
    hello();
});

function hello(){
    console.log("good " + greeting);
}

使用参数和参数,此代码也是如此:

d3.select("#button1").on("click", function(){
    hello("morning");
});

d3.select("#button2").on("click", function(){
    hello("evening");
});

function hello(greeting){
    console.log("good " + greeting);
}

据我所知,“我的方式”更糟糕,因为它有点长,并且使用必须是全局的变量(或至少比函数高一级)。但是,除此之外,我想问你:

  1. 效率:其中一个示例比其他示例更快?使用其中一种或其他方式有什么好处吗?
  2. 可读性:我知道争论更常见,但“我的方式”可以理解吗?这太奇怪了吗?
  3. 这是一种不好的编码方式吗?
  4. 注意:请随意将其标记为重复,但我搜索了很多并且未找到此特定问题:它不是将变量用作参数,而是使用变量而不是参数。感谢。

2 个答案:

答案 0 :(得分:2)

总的来说,你这样做的方式,(使用全局变量)通常是不好的做法,但如果你把它从全局范围中拿出来,它实际上可以非常方便。读到oop,你肯定会遇到这样的事情。

function person(name){
  this.name = name;
  this.color;
  this.greeting = function(){ 
    alert("Hello,  my name is "+this.name+" and my favorite color is "+this.color); 
  };
}

var me = new person("James");
me.color = "green";
me.greeting();

fiddle

在此示例中,您有一个设置为对象的变量,对象的函数使用对象中的变量,而不是将其作为参数传递。这种思维方式在面向对象编程中是有用的(也是必要的)。

另外,只是为了踢,我做了一些基准测试,看看哪种方法真的更快。这是一个小提琴,将为你测试它。 check it out

答案 1 :(得分:1)

原因,这是一个不好的做法,在你的第一个例子中,你正在使用不纯的函数,其中一个函数正在使用程序的状态来执行一组指令(在这个例子中,它的变量 - 问候语)。

function hello(){
   console.log(“good ” + greeting);
}

Greeting是全局内存中的变量,这意味着hello执行依赖于状态的操作。

因此,在调用' hello'时,无法从外部了解该功能将执行的操作。

始终使用纯函数。

  

纯函数是一个函数,其输出完全取决于它的函数   输入

不纯函数使用状态作为隐藏输入,这意味着,函数hello根据程序的状态返回不同的行为,在我看来,这在处理可重用行为时是不可取的。 但纯函数,将所有必要的变量作为参数,因此

  

PureFunction(args ...)总是返回一个值,无论应用程序处于什么状态,该值都是相同的。

修改: 纯函数不会沉溺在I / O中。我仍然认为,使用这种方法可以更好地模块化我们的代码。

function hello(greeting){
   console.log(“good ” + greeting); 
}
d3.select(“#button1”).on(“click”, hello.bind(null,“morning”)));

d3.select(“#button2”).on(“click”, hello.bind(null,“evening”));