[ydkjs] wss个人理解立即执行表达式(function......)() 不加;的错误

读这本书的时候遇到了这样的一个情况

		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上的一个默认执行函数的东西,,等我再看看。。 一个前端小菜鸟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值