var b = 10; (function b(){ b = 20; console.log(b); })();
为什么结果会输出函数,还有想问下括号里面的这个b函数有函数提升吗
b
在函数表达式里函数名是不可变的,只能引用,不能赋值。如果你加上 'use strict' 在 strict mode 下就可以观察到报错。
'use strict'
@轻键快码 10 后面需要加分号
这里不存在函数提升,函数提升只存在于「函数声明」的情况,而不存在于「函数表达式的」的情况。关于「函数声明」和「函数表达式」的区别,网上很多文章讲的很清楚了,可以自己搜索学习。
2楼说的意思是,在一个函数里面修改它的函数名是不能实现的,比如说:
(function a(){ a = 10; //这个表达式不会成功,函数a依旧是函数a,至于这里面的a = 10等同于被废弃了,也不会生成相应的全局变量 })();
至于为什么输出的是函数a而不是20,简单点就是那个语句直接被略过了,等同于
var b = 10; (function b(){ console.log(b); })();
补充:刚刚被人提醒了,自执行函数也是属于函数表达式,开始写答案的时候给了误导很抱歉。
var b = 10; var b = (function(){ b = 10; console.log(b); //输出:10 })(); console.log(b); //输出:undefined 。 b在自执行函数那里没有获取到返回值
在函数表达式里函数名是不可变的,只能引用,不能赋值。如果你加上
'use strict'
在 strict mode 下就可以观察到报错。@轻键快码 10 后面需要加分号
这里不存在函数提升,函数提升只存在于「函数声明」的情况,而不存在于「函数表达式的」的情况。
关于「函数声明」和「函数表达式」的区别,网上很多文章讲的很清楚了,可以自己搜索学习。
2楼说的意思是,在一个函数里面修改它的函数名是不能实现的,比如说:
至于为什么输出的是函数a而不是20,简单点就是那个语句直接被略过了,等同于
补充:
刚刚被人提醒了,自执行函数也是属于函数表达式,开始写答案的时候给了误导很抱歉。