假设我们有两个按钮,一个用于“早上”,另一个用于“晚上”,我希望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);
}
据我所知,“我的方式”更糟糕,因为它有点长,并且使用必须是全局的变量(或至少比函数高一级)。但是,除此之外,我想问你:
注意:请随意将其标记为重复,但我搜索了很多并且未找到此特定问题:它不是将变量用作参数,而是使用变量而不是参数。感谢。
答案 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”));