javascript 不用匿名的函数表达式
PHPz
PHPz 2017-04-10 16:00:17
[JavaScript讨论组]

var a = function b(){};
a(); //正常
b(); //报错

这是为什么?????

PHPz
PHPz

学习是最好的投资!

全部回复(4)
怪我咯

function b () {} 这种形式是一个函数声明,而 var a = function () {} 这种形式是函数表达式,所以 var a = function b () {} 也是一个函数表达式,只不过表达式中的函数带有名字,但因为这个声明形式是函数表达式而非函数声明,所以 b 这个名称是不会被在当前作用域下声明成为一个可调用的函数,这是因为函数表达式的执行过程是建立一个函数对象然后返回给变量,从头到尾都没有作用域下的声明行为,不过在函数中是可以调用函数它自己的名称的.

详情可看 @锋云战锦 的链接,说的很好。

另外请注意函数声明提升:

c();
function c () {
  return "c";
}
// :)

d();
var d = function () {
  return "d";
}
// :(  Uncaught TypeError: undefined is not a function 
大家讲道理

isayme.github.io/#javascript-anonymous-functions.html

请看

伊谢尔伦

在 JS 里面函数有两种定义的方法

  1. 函数声明

  2. 函数表达式

其中函数声明只有一种形式:

  • function 标识符(形参) { 函数代码 }

而函数表达式有两种写法:

  • function (形参) { 函数代码 }

  • function 标识符(形参) { 函数代码 }

可见,函数声明的语法和函数表达式的第二种语法是一样的。函数声明只会声明一个函数,因为有变量声明提升的机制,所以函数声明不会有返回值。而函数表达式不是一个声明,是一个标准的 js 表达式,会有一个返回值,返回值就是定义的那个函数。所以说对于函数声明和函数表达式的第二中写法的区分就是要看需不需要一个返回值。var a = function b(){}显然需要一个返回值,所以function b(){} 是一个函数表达式。如果把其作为一个函数声明,那么根据变量声明提升就会导致这一句代码有错误。
函数表达式的第二种写法的执行过程是:

  1. 创建一个新的词法记录器(在函数执行的时候会根据这个记录器创建作用域)

  2. 在记录器中创建一个名为标识符的变量。

  3. 根据函数代码创建一个函数

  4. 把那个标识符 初始化为这个函数

  5. 返回这个函数

也就是说,在函数表达式中给出的那个函数名仅仅在该函数中有效。只能在定义的那个函数中使用。
参考 http://www.ecma-international.org/ecma-262/5.1/#sec-13

怪我咯

这个和浏览器有关吧!请看这个 http://bonsaiden.github.io/JavaScript-Garden/zh/#function.general

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

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