!function a(){ console.log('1'); }
a();//a is not defined
不是很理解a为什么undefined了,从另外一个等价的函数表达式来看var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?
叹号是什么鬼!
楼上说的对!
问题应该在于!function
前面的!
首先要明白!function a(){...}
效果和
(function(){
var a = function(){...}
a()
}())
一样,就是说a是临时变量且作用域为函数体内,一旦函数执行完成则随栈帧弹出(失效)。
1.因为你把这个匿名函数的返回值赋值给a,而不是把函数本身赋值给a
2.你这个匿名函数没有返回值
表达式执行后获得的结果,才会赋值给等号左边
不是很理解a为什么undefined了,从另外一个等价的函数表达式来看
var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?
你这句话等同于
js
var a = function (){ console.log('1'); }();
因为 function()
本来就没有返回值,所以 a
的值是 undefined
如果你想把 a
定义成函数,再执行,应该这样
js
var a = function() { console.log(1) }; a();
补充一下:
如果 function 语法是在一个表达式中(比如上述写法和你的 !
写法都是表达式),关键字 function
后面的 "变量" 只是函数的名字,而不会产生变量,比如
js
var a = function b() {} // typeof a === "function" // typeof b === "undefined" // a.name === "b" 注意:IE下可能 a.name === undefined
第二个问题
var a = function (){ console.log('1'); }();
这里的写法可以分解为:
var b=function(){console.log('1');};
var a=b(); //没有返回值,默认undefined;
这样是不是就理解了
第一个问题:
!function a(){ console.log('1'); }
a();//a is not defined
为什么是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有一个特性:
作为函数名的标识符(在这里是 a )只能从函数体内部访问,在函数外部访问不到 (IE9+)。
试试!function a(){ console.log(a); }()
是什么结果呢?
第二个问题:
var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?
=
右边是一个立即执行的函数表达式,会把执行结果赋值给a,注意a不是一个函数,而你右边的函数没有返回值,所以执行a是undefined
,如果想让a是一个函数的话,要这样写
var a = function (){ console.log('1'); };
顺便说一下,a is not defined
是一个错误,而undefined
是一个基本数据类型,二者不可混谈
首先 你的写法是有问题的 。。
!function a(){ console.log('1'); }() 才是正确的写法 注意后面还有()
接下来说说感叹号的作用
// 常见的(多了一对括号),调用匿名函数:
(function() {})()
// 但在前面加上一个布尔运算符(只多了一个感叹号),就是表达式了,将执行后面的代码,也就合法实现调用
!function() {}()
另外 +function() {}() 一样的效果 都是执行匿名函数
+、! 比()节省一个字符,或者说比()好看些