!function a(){ console.log('1'); }
a();//a is not defined
不是很理解a为什么undefined了,从另外一个等价的函数表达式来看var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
第一个问题:
为什么是
a is not defined
?首先,我要说
!function a(){ console.log('1'); }
这个写法,!
是让后面的函数立即执行,但是你并没有给它传参数(加个()),!function a(){ console.log('1'); }
的实际意思是对这一堆字符串取非,结果就是false
咯~!function a(){ console.log('1'); }()
才会执行console.log('1')
但即使是这样,执行
a()
依旧是错误,为什么呢?因为这不仅是一个立即执行的函数表达式,还是一个具名函数表达式(Named function expression, NFE),NFE有一个特性:
试试
!function a(){ console.log(a); }()
是什么结果呢?第二个问题:
=
右边是一个立即执行的函数表达式,会把执行结果赋值给a,注意a不是一个函数,而你右边的函数没有返回值,所以执行a是undefined
,如果想让a是一个函数的话,要这样写顺便说一下,
a is not defined
是一个错误,而undefined
是一个基本数据类型,二者不可混谈问题应该在于
!function
前面的!
表达式执行后获得的结果,才会赋值给等号左边
首先 你的写法是有问题的 。。
接下来说说感叹号的作用
+、! 比()节省一个字符,或者说比()好看些
你这句话等同于
因为
function()
本来就没有返回值,所以a
的值是undefined
如果你想把
a
定义成函数,再执行,应该这样补充一下:
如果 function 语法是在一个表达式中(比如上述写法和你的
!
写法都是表达式),关键字function
后面的 "变量" 只是函数的名字,而不会产生变量,比如第二个问题
这里的写法可以分解为:
这样是不是就理解了
1.因为你把这个匿名函数的返回值赋值给a,而不是把函数本身赋值给a
2.你这个匿名函数没有返回值
首先要明白
!function a(){...}
效果和一样,就是说a是临时变量且作用域为函数体内,一旦函数执行完成则随栈帧弹出(失效)。
叹号是什么鬼!
楼上说的对!