You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 这里的报错原因感觉是这样的
1: function (){console.log(123)}(); // 报错 Uncaught SyntaxError: Function statements require a function name
2:function asdfas(){console.log(123)}();// 报错 Uncaught SyntaxError: Unexpected token ')'
1浏览器解析执行为:
function (){console.log(123)();// 一个匿名函数表达式紧跟(),浏览器会解析该圆括号为函数调用(定义一个函数有三种方式:函数声明,new,赋值函数表达式),该匿名函数表达式既不是赋值函数表达式,也不是函数声明,也没有使用new操作符声明,由于定义函数的默认方式是函数声明,所以这里解析该匿名表达式为函数声明,所以报函数声明语法错误
new function (a){console.log(a)}(1)// => 1 可以证明这一点
2浏览器解析执行为:
function asdfas(){console.log(123)} // 根据代码从上到下从左往右的解析机制,这是一个完整的函数声明语句,没有问题继续往后解析
(); // 是圆括号内表达式不能为空,所以报了圆括号的语法错误
小括号用法
1. 改变运算符的优先级
2.函数声明和函数调用参数列表:
3.在循环语句中调用
4.函数声明,函数表达式,立即调用函数
函数声明必须带有标识符,也就是函数名,但是函数表达式方式,标识符带不带都可以。
要区分一个代码是函数声明还是函数表达式,那要看代码的应用上下文。
所以如果函数被当做函数表达式来进行调用时,this指向始终为window 间接引用
三种自执行函数
上面三个语句都是在运算符相关上下文中,所以都是表达式,就可以强制调用了,下面做一下分析:
所以只要通过运算符将语句改成了该表达式,不管这是个什么样的表达式< (,),-,+, >,都会先返回函数体的引用,然后再执行其他操作,如进行调用()*
The text was updated successfully, but these errors were encountered: