我坚持使用'返回函数的函数'这个概念.我指的是Stoyan Stefanov撰写的"面向对象的Javascript"一书.
片段一:
    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b();
    }
    
    var s = a();
    alert('break');
    s();输出:
A!
B!
break
小片二
function a() {
  
    alert('A!');
    function b(){
        alert('B!'); 
    }
    return b;
}
var s = a();
alert('break');
s();A!
break
B!
有人可以告诉我返回b和b()上面的片段之间的区别吗?
kzh*_*kzh 107
将变量赋值给函数(不带括号)会复制对函数的引用.将括号放在函数名的末尾,调用函数,返回函数返回值.
function a() {
    alert('A');
}
//alerts 'A', returns undefined
function b() {
    alert('B');
    return a;
}
//alerts 'B', returns function a
function c() {
    alert('C');
    return a();
}
//alerts 'C', alerts 'A', returns undefined
alert("Function 'a' returns " + a());
alert("Function 'b' returns " + b());
alert("Function 'c' returns " + c());
在您的示例中,您还在函数中定义函数.如:
function d() {
    function e() {
        alert('E');
    }
    return e;
}
d()();
//alerts 'E'
该函数仍可调用.它仍然存在.这在JavaScript中一直使用.函数可以绕过只是像其他值.考虑以下:
function counter() {
    var count = 0;
    return function() {
        alert(count++);
    }
}
var count = counter();
count();
count();
count();
函数计数可以保留在其外部定义的变量.这称为闭包.它在JavaScript中也经常使用.
Mic*_*ski 43
返回函数名称而不()返回对函数的引用,该引用可以像您一样分配var s = a().s现在包含对函数的引用b(),并且调用s()在功能上等同于调用b().
// Return a reference to the function b().
// In your example, the reference is assigned to var s
return b;
()在return语句中调用函数执行函数,并返回函数返回的任何值.它类似于调用var x = b();,但不是分配返回值b()而是从调用函数返回它a().如果函数b()本身没有返回值,则undefined在完成其他任何工作后,调用将返回b().
// Execute function b() and return its value
return b();
// If b() has no return value, this is equivalent to calling b(), followed by
// return undefined;
Che*_*eso 16
返回b是返回一个函数对象.在Javascript中,函数只是对象,就像任何其他对象一样.如果您发现没有帮助,只需将"对象"替换为"对象"即可.您可以从函数返回任何对象.您可以返回true/false值.整数(1,2,3,4 ......).你可以返回一个字符串.您可以返回具有多个属性的复杂对象.你可以返回一个功能.功能只是一件事.
在你的情况下,返回b返回的东西,东西是一个可调用的函数.返回b()返回可调用函数返回的值.  
考虑以下代码:
function b() {
   return 42;
}
使用上面的定义,return b();返回值42.另一方面,return b;返回一个函数,它本身返回值42.它们是两个不同的东西.
当你返回时b,它只是对函数b的引用,但此时并没有被执行。
当您 return 时b(),您正在执行该函数并返回其结果。
尝试alert在typeof(s)你的例子中。片段 b 将为您提供“功能”。片段 a 会给你什么?
将函数想象为一种类型,如 int。您可以在函数中返回整数。您也可以返回函数,它们是“function”类型的对象。
现在是语法问题:因为函数返回值,所以你怎么能返回一个函数而不是它的返回值呢?
通过省略括号!因为如果没有括号,函数就不会被执行!所以:
return b;
将返回“函数”(想象一下,如果您返回一个数字),同时:
return b();
先执行函数,然后返回执行得到的值,差别很大!
| 归档时间: | 
 | 
| 查看次数: | 174657 次 | 
| 最近记录: |