对返回函数的函数的混淆

时间:2016-04-23 01:11:56

标签: javascript

帮助我理解以下这些代码。我还是JavaScript的新手。

我们知道以下代码将使用消息

运行alertbox

// 1
function box() {
  alert('A');
  return function() {
    alert('B');
  }
}
var x = box();

我们知道以下内容将运行警报框A ,然后是警报框B

// 2
function box() {
  alert('A');
  return function() {
    alert('B');
  }
}
var x = box();
x();

行为中的

但是 就像代码段1那样。期待它运行仅限警报框B. /强>

// 3
function box() {
  alert('A');
  return function() {
    alert('B');
  }
}
var x = box; // no invoking box function
x();

问题:为什么这会发生在代码段3中?我们不是只调用x函数吗?从代码段1和2我们知道运行x()会触发警报框B,但为什么它不会出现在代码段3上?

4 个答案:

答案 0 :(得分:3)

当你写var x = box;时,你需要存储功能" BOX"在变量X上。你没有执行你的盒子功能。要执行,您需要将括号用作box()

由于您刚刚存储了该功能并且未运行该功能,因此当您致电x()时,其结果与调用box()相同。

  

简单示例

function print(value) {
  alert(value);
}

致电print('xcode')时会发生什么? - 您的浏览器会提醒" XCODE"正如你刚用该参数调用函数一样。

现在: var x = print;

我在这里复制'打印'功能到' x'变量

最后,当你致电x('xcode again')时会发生什么? - 您的浏览器会像以前一样警告" XCODE AGAIN"

答案 1 :(得分:1)

似乎你有95%的理解这一点,但最后你出轨了。

你是正确的,在第三个片段中,我们将函数保存到变量x

function box() {
  alert('A');
  return function() {
    alert('B');
  }
}
var x = box; // no invoking box function
x();

但是因为我们实际上没有调用box(),所以我们只将函数存储在新变量var x中。因此,通过致电x(),我们基本上只是致电box()

我们获得alert('B')的唯一时间是将box函数的返回值保存到新变量,然后调用该新变量,就像我们在片段中所做的那样2。

我希望有所帮助。

答案 2 :(得分:1)

function box() {
  alert('A');
  return function() {
    alert('B');
  }
}

//fires box() thus firing alert('A');
//returns a function that holds alert('B');
var x = box();

function box() {
  alert('A');
  return function() {
    alert('B');
  }
}

//fires box() thus firing alert('A');
//returns a function that holds alert('B');
var x = box();

//fires the returned function alert('B');
x();

function box() {
  alert('A');
  return function() {
    alert('B');
  }
}

//sets x EQUAL to box, nothing special nothing happens
var x = box; // no invoking box function

//fires box() thus firing alert('A');
//returns a function that holds alert('B');
x();

答案 3 :(得分:0)

它提醒A,因为 正在调用box

x是对函数box的引用。当您写x()时,它与调用box()相同。 提醒B,因为您没有通过调用box调用返回的函数。



function box() {
  alert('A');
  return function() {
    alert('B');
  }
}
var x = box; // no invoking box function
x()();




这与执行此操作相同:



function box() {
  alert('A');
  return function() {
    alert('B');
  }
}

// x1 is a reference to the function box, which alerts, and returns a function
var x1 = box;

// x2 is now the return value of box, the function. A side effect is that
// "A" is alerted.
var x2 = x1();

// Now you're calling the function returned by `box`, which alerts "B".
x2(); // Alerts B