JavaScript立即执行函数不能被调用

!function a(){ console.log('1'); }

a();//a is not defined

不是很理解a为什么undefined了,从另外一个等价的函数表达式来看
var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?

阅读 9k
9 个回答

第一个问题:

!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前面的!

首先要明白!function a(){...}效果和

(function(){
  var a = function(){...}
  a()
}())

一样,就是说a是临时变量且作用域为函数体内,一旦函数执行完成则随栈帧弹出(失效)。

表达式执行后获得的结果,才会赋值给等号左边

首先 你的写法是有问题的 。。

!function a(){ console.log('1'); }()  才是正确的写法  注意后面还有()

接下来说说感叹号的作用

// 常见的(多了一对括号),调用匿名函数:
(function() {})()

// 但在前面加上一个布尔运算符(只多了一个感叹号),就是表达式了,将执行后面的代码,也就合法实现调用
!function() {}()

另外 +function() {}() 一样的效果 都是执行匿名函数

+、! 比()节省一个字符,或者说比()好看些

不是很理解a为什么undefined了,从另外一个等价的函数表达式来看

var a = function (){ console.log('1'); }();

发现a被调用后然后销毁了,请问这里面是怎么回事呢?

你这句话等同于

jsvar a = function (){ console.log('1'); }();

因为 function() 本来就没有返回值,所以 a 的值是 undefined

如果你想把 a 定义成函数,再执行,应该这样

jsvar a = function() { console.log(1) }; a();

补充一下:
如果 function 语法是在一个表达式中(比如上述写法和你的 ! 写法都是表达式),关键字 function 后面的 "变量" 只是函数的名字,而不会产生变量,比如

jsvar 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;

这样是不是就理解了

1.因为你把这个匿名函数的返回值赋值给a,而不是把函数本身赋值给a
2.你这个匿名函数没有返回值

叹号是什么鬼!
楼上说的对!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏