关于javascript中返回函数的案例
PHP中文网
PHP中文网 2017-04-11 12:13:57
[JavaScript讨论组]
    function foo(){
       var a=2;
       function bar(){
          //dosomething
       }
       return bar;
    }
    var baz=foo();
    baz();

在这段代码中,返回了bar函数本身;如果把return bar更改为alert(bar),就会输出:

    function bar(){
       //dosomething
    }

那么是不是可以认为,var baz=foo()等价于:

    var baz=function bar(){
       //dosomething
    }

有两个疑问:

  1. 代码中的return bar,能够返回函数本身么?

  2. 最后这个等价函数,在形式上不是函数声明,好像也不是函数表达式(函数表达式中的function应该是匿名的)这里该如何理解这种形式呢?还烦请大伙解惑!!

补充:a、既然能写成var baz=function bar(){//dosomething},根据这个函数目前所书写的位置,那么现在bar()函数的下一个外包环境,就是全局环境。如果说法成立,那就会和bar在函数foo内部相互矛盾,也就是bar函数脱离了foo函数,出现在了全局环境中;那闭包岂不是不能形成??
(闭包的概念:内部函数能够访问外部函数的变或函数。)
b、如果说写成var baz=function bar(){//dosomething}后,bar()函数还是存在于foo函数词法作用域的内部,但是根据词法作用域的查找规则,对bar的查找是不会进入foo函数的内部,那就应该无法调用baz();会出现报错;而这里还能调用????

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(7)
迷茫

第一,var baz = foo()var baz = function bar() { ... } 并不等价,两个函数的作用域不同。因为不同,所以“相同”来理解的很多问题就迎刃而解了。

第二,var baz = function bar() { ... } 是命名函数表达式,与常说的匿名函数表达式有一点不同(名称)。

第三,是不是闭包,主要看函数定义所在的作用域,以及函数内部是否使用该作用域的局部变量(或函数)。

第四,var baz = function bar() { ... } 虽然是命名的,但是它并不会在这个作用域中产生这个名称的函数,所以直接访问不到。只是 baz.name 会有 "bar" 这个值(某些 JS 引擎可能会忽略这个名称,所以取到的是 undefined)。

PHP中文网

1 能

> var baz=function bar(){
... return bar;
... }
undefined
> baz()
[Function: bar]

2

> var baz=function bar(){
...        //dosomething
...     }
undefined
> baz
[Function: bar]
> bar
ReferenceError: bar is not defined
怪我咯

一、不确定,看JS解释器了,建议不要这样写,而是写成:

return function() {
    //dosomething
};

或者:

var bar = function() {
    //dosomething
};
return bar;

二、应该是:

function bar() {
    //dosomething
}
var baz = bar; // 注意:没有括号!
巴扎黑
  1. 函数也是对象,是一种可以执行的特殊对象,其具有所有对象具有的特性,所以是可以直接return bar返回的是对象所指向的地址,我们可以通过这个地址访问到函数本身。

  2. 最后这个你说的等价函数,其实就是一个匿名函数赋值表达式,将一个函数地址赋值给baz变量。

其实这两种是不等价的,因为其函数作用域不同,var baz=foo()这个形成闭包。

巴扎黑

就相当于 return function() { ... },只不过这里返回的bar函数内容是基于foo环境的函数

这里不是等价关系,指的是返回一个延时函数,可以在其他任意地方再继续执行

PHPz

第一个问题:你如果使用alert,括号内部应该加引号了,不然alert输出的是object。因为函数是对象的一种,return 函数其实是return的对象,返回这个对象,从而形成闭包。
第二个问题:var baz = foo();其实等价于var baz = function (){};其实相当于将保存函数的foo的内存地址复制一份保存为baz。
只是个人理解,如有不对,望给予更正。

高洛峰

1.在Javascript中是可以返回函数的
2.var baz = function bar() {}也是函数表达式,叫命名函数表达式。如果你想在函数体内引用当前函数,就需要使用命名函数表达式,比如递归的时候。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号