JavaScript中的匿名函数:两种方式,相同的结果

时间:2014-09-03 06:03:10

标签: javascript

我是JavaScript的新手,我试图了解是否有理由在if / else块中创建两个匿名函数,而不是创建一个匿名函数并将整个if / else块放在其中功能

我正在进行的教程(Code School)建议提醒以下两个选项之一:

var greeting;
var newCustomer = false;

if (newCustomer) {
  greeting = function () {
    alert("Hello, new customer.")
  };
} else {
  greeting = function () {
    alert("Hello, returning customer.")
  };
}

welcome(greeting);

function welcome(message) {
  message();
}

当我在没有参考教程的情况下尝试编写时,我最终编写了这个,这产生了与上面相同的结果:

var greeting;
var newCustomer = false;

var greeting = function () {
  if (newCustomer) {
    alert("Hello, new customer.")
  } else {
    alert("Hello, returning customer.")
  }
}

welcome(greeting);

function welcome(message) {
  message();
}

2 个答案:

答案 0 :(得分:0)

与几乎所有情况一样,这取决于具体情况,最佳方法取决于您需要做什么。在这个人为的例子中很难说哪个更好,但第一种方法有一些优点,因为如果在创建newCustomer时已知greeting,那么最好执行该决策逻辑前面,而不是以后再推迟。然而,如果是我,我可能不会选择这两个选项并按照DRY原则执行此操作,并且是两个世界中最好的(预先确定逻辑并且创建的函数始终保持一致):

var greetingText,
    greeting;
var newCustomer = false;

if (newCustomer) {
  greetingText = "Hello, new customer.";
} else {
  greetingText = "Hello, returning customer.";
}

greeting = function () {
    alert(greetingText);
}

welcome(greeting);

function welcome(message) {
  message();
}

然后可以缩短为:

var greetingText,
    greeting;
var newCustomer = false;

greetingText = "Hello, " + (newCustomer ? "new" : "returning") + " customer.";    

greeting = function () {
    alert(greetingText);
}

welcome(greeting);

function welcome(message) {
  message();
}

答案 1 :(得分:0)

我猜不同之处在于评估if语句的不同时刻。在第一种情况下,它立即评估一次,在第二种情况下每次调用该函数。

因此,如果条件无法改变,您将使用第一种方式,因此没有理由一遍又一遍地评估它。例如,当您测试特定方法的浏览器支持时。

并且你将if语句放在函数中是出于完全相反的原因。