读这本书的时候遇到了这样的一个情况
var a=2
(function foo(){ //此行出现错误 Uncaught TypeError:
// 2 is not a function
var a=3
console.log(a)
})()
console.log(a)
那么问题就来了 为什么报错,立即执行表达式报错,这个时候我就发现,我根本就不了解 立即执行表达式
var a=2
function foo(){
var a=3
console.log(a)
}
(foo)()//3
console.log(a)//2
把函数写成这样就正常执行 那是为什么呢?
实在想不明白 当我把
function foo(){
var a=3
console.log(a)
}
var a=2
(foo)() // Uncaught TypeError: 2 is not a function
console.log(a)
这个时候我明白了,也明白了为什么报错在立即执行表达式中
== 出这个错误完全是由于我代码不规范 没有添加 ;导致==
var a=2(function foo(){var a=3console.log(a)})()
没错我的代码就是这么的不规范 我giao
他把这一行当成了函数表达式来进行词法解析,
所以当2后面有立即执行表达式()()所以直接把2当成一个函数来处理,所以出现了类型错误
问题是解决了但是,我懂立即执行表达式了吗 并不懂
var b = 2
var c = 3
function foo(b,c){
var a=1
console.log(b)//4
console.log(c)//5
}
foo(4,5)
想理解立即执行表达式(function…)()
首先就要知道()()值怎么执行的
然而机智的我立刻就联想到了上面
想知道()()如何执行的
先确保我是不是真正的理解foo()这个函数执行
foo 所代表的就是函数声明然而加上()之后就变成了函数表达式
而foo(4,5)里面的参数也就传入到了foo里面执行
所以foo()()也是这样的执行,foo函数由左向右一次()帮助执行
var b = 2
var c = 3
function foo(b,c){
var a=1
console.log(b)
console.log(c)
return foo
}
foo(4,5)(6,7)(8,9)(10,11)//4,5,6,7,8,9,10,11
console.log(foo(4,5)(6,7)(8,9)(10,11))
//ƒ foo(b,c)
//{var a=1console.log(b)
//console.log(c)return foo}
可能这就是函数链
当前一个函数返回的是一个函数时,下一个()可以接着调用执行上一个函数所返回的函数
然而立即执行表达式是什么
function foo(a){
console.log(a)
return function foo2(a){
console.log(a)
console.log(this)
}
}
foo(1)()
// 1
// undefined
// Window
其实很明显 个人认为()()立即执行表达式其实就是 window里面的是一个函数容器,第一个括号里的函数作为返回值,其实和别的函数是一样的
function foof(e){
return e
}
foof(function foo(){
var a=3
console.log(a) //3
console.log(this)//Window
})()
也就是
window.某个方法 = foof,立即执行表达式不是特例,而是普遍现象,后面括号调用的目标参数隐藏起来了,然而究竟是什么,有人知道也可以,告诉一下小弟,其实就是所有执行发起所有函数执行的挂载在window上的一个默认执行函数的东西,,等我再看看。。 一个前端小菜鸟