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
}
有两个疑问:
代码中的return bar,能够返回函数本身么?
最后这个等价函数,在形式上不是函数声明,好像也不是函数表达式(函数表达式中的function应该是匿名的)这里该如何理解这种形式呢?还烦请大伙解惑!!
补充:a、既然能写成var baz=function bar(){//dosomething},根据这个函数目前所书写的位置,那么现在bar()函数的下一个外包环境,就是全局环境。如果说法成立,那就会和bar在函数foo内部相互矛盾,也就是bar函数脱离了foo函数,出现在了全局环境中;那闭包岂不是不能形成??
(闭包的概念:内部函数能够访问外部函数的变或函数。)
b、如果说写成var baz=function bar(){//dosomething}后,bar()函数还是存在于foo函数词法作用域的内部,但是根据词法作用域的查找规则,对bar的查找是不会进入foo函数的内部,那就应该无法调用baz();会出现报错;而这里还能调用????
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
第一,
var baz = foo()和var baz = function bar() { ... }并不等价,两个函数的作用域不同。因为不同,所以“相同”来理解的很多问题就迎刃而解了。第二,
var baz = function bar() { ... }是命名函数表达式,与常说的匿名函数表达式有一点不同(名称)。第三,是不是闭包,主要看函数定义所在的作用域,以及函数内部是否使用该作用域的局部变量(或函数)。
第四,
var baz = function bar() { ... }虽然是命名的,但是它并不会在这个作用域中产生这个名称的函数,所以直接访问不到。只是baz.name会有"bar"这个值(某些 JS 引擎可能会忽略这个名称,所以取到的是undefined)。1 能
2
一、不确定,看JS解释器了,建议不要这样写,而是写成:
或者:
二、应该是:
函数也是对象,是一种可以执行的特殊对象,其具有所有对象具有的特性,所以是可以直接return bar返回的是对象所指向的地址,我们可以通过这个地址访问到函数本身。
最后这个你说的等价函数,其实就是一个匿名函数赋值表达式,将一个函数地址赋值给baz变量。
其实这两种是不等价的,因为其函数作用域不同,
var baz=foo()这个形成闭包。就相当于
return function() { ... },只不过这里返回的bar函数内容是基于foo环境的函数这里不是等价关系,指的是返回一个延时函数,可以在其他任意地方再继续执行
第一个问题:你如果使用alert,括号内部应该加引号了,不然alert输出的是object。因为函数是对象的一种,return 函数其实是return的对象,返回这个对象,从而形成闭包。
第二个问题:var baz = foo();其实等价于var baz = function (){};其实相当于将保存函数的foo的内存地址复制一份保存为baz。
只是个人理解,如有不对,望给予更正。
1.在
Javascript中是可以返回函数的2.
var baz = function bar() {}也是函数表达式,叫命名函数表达式。如果你想在函数体内引用当前函数,就需要使用命名函数表达式,比如递归的时候。