帮助我理解以下这些代码。我还是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上?
答案 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