!function a(){ console.log('1'); }
a();//a is not defined
不是很理解a为什么undefined了,从另外一个等价的函数表达式来看var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?
!function a(){ console.log('1'); }
a();//a is not defined
不是很理解a为什么undefined了,从另外一个等价的函数表达式来看var a = function (){ console.log('1'); }();
发现a被调用后然后销毁了,请问这里面是怎么回事呢?
首先要明白!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被调用后然后销毁了,请问这里面是怎么回事呢?
你这句话等同于
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;
这样是不是就理解了
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
第一个问题:
为什么是
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
是一个基本数据类型,二者不可混谈