JS中不带括号的函数调用和赋值
Calling and assigning functions in JS without parenthesis
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
即使 displayName 没有括号,上面的代码仍然有效,即传递对 displayName 的引用,然后由 makeFunc() 调用。
现在,如果您这样做 return displayName(); var myFunc = makeFunc;
它也会按预期工作。但是,如果您执行 return displayName; var myFunc = makeFunc;
它会停止工作。
它应该可以工作,因为 myFunc() 会调用这两个函数?
函数引用只是 JavaScript 中的一个值。函数 call 是一个涉及两件事的表达式:对函数的引用和带括号的参数列表。
没有参数列表,对函数的引用只是一个值。
因此,在您的代码中:
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
函数中的标识符"displayName"指的是那个内部函数。 return
语句引用了标识符 而没有 带括号的参数列表。因此,来自 makeFunc()
的 return 值是对该内部函数的引用。将其赋值给另一个变量会赋予该变量相同的值,因此稍后可以在函数调用表达式中使用它。
请注意,您可以调用 makeFunc()
并立即调用 returned 函数:
makeFunc()();
这是 两个 函数调用表达式的序列。第一个是 makeFunc()
。 return 是一个函数引用,因此调用该函数是因为第二个 ()
。
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
即使 displayName 没有括号,上面的代码仍然有效,即传递对 displayName 的引用,然后由 makeFunc() 调用。
现在,如果您这样做 return displayName(); var myFunc = makeFunc;
它也会按预期工作。但是,如果您执行 return displayName; var myFunc = makeFunc;
它会停止工作。
它应该可以工作,因为 myFunc() 会调用这两个函数?
函数引用只是 JavaScript 中的一个值。函数 call 是一个涉及两件事的表达式:对函数的引用和带括号的参数列表。
没有参数列表,对函数的引用只是一个值。
因此,在您的代码中:
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
函数中的标识符"displayName"指的是那个内部函数。 return
语句引用了标识符 而没有 带括号的参数列表。因此,来自 makeFunc()
的 return 值是对该内部函数的引用。将其赋值给另一个变量会赋予该变量相同的值,因此稍后可以在函数调用表达式中使用它。
请注意,您可以调用 makeFunc()
并立即调用 returned 函数:
makeFunc()();
这是 两个 函数调用表达式的序列。第一个是 makeFunc()
。 return 是一个函数引用,因此调用该函数是因为第二个 ()
。