可以让函数在创建后立即执行 必须是一个表达式
1、函数的定义方式一: 函数声明
2、函数的定义方式二: 函数表达式(匿名函数表达式、命名函数表达式)
1、错误写法 直接报错 js引擎看到function关键字会认定后面跟的是函数定义语句,此时后面如果直接加上()会被当做分组操作符,而分组操作符必须有表达式,所以此时报错
2、立即执行函数的正确写法,让js引擎认为这是一个表达式
1、立即执行函数不能再外面再被调用,执行完之后已经被立即销毁了。所以立即执行函数的函数名称可以省略, 统一使用匿名函数表达式
2、由于立即执行函数,执行完后就立即被销毁了 所以它可以创建一个独立的作用域,而且该作用域里面的变量,外面访问不到。因此就可以避免变量污染
正确输出写法:用立即执行函数将i作为参数传入,立即函数每次执行时,会把参数i的值复制一份。然后再创建函数作用域来执行函数
1、立即执行函数和闭包只是有一个共同有点就是都能减少全局变量的使用
2、立即执行函数只是函数的一种调用方式,声明完后立即调用,一般只能调用一次,调用完后会立即被销毁,不会占用内存,有自己的独立作用域,外部不能调用
3、闭包则主要是让外部函数可以访问内部函数的作用域,也减少了全局变量的使用,保证了内部变量的安全,但是被引用的内部变量不会被销毁,增大了内存消耗,使用不当会容易造成内存泄露
可参考: https://www.cnblogs.com/wenxuehai/p/10357274.html
自定义函数就是说自己写的函数,只有自己调用,或是自己共享给别人后别人才可以调用的。也可以理解为私有函数。
function a(){alert(1)} //定义一个函数,名字是a。函数调用,就是让函数执行。
a() //函数名字后面加一对小括号就可以执行了, 页面中将弹出一个 1在JS中函数的定义可以分为两种:1. 函数声明
2. 函数表达式
根据你的代码,下面的代码就是函数的声明(当然另外一段代码是函数表达式):
function a (){
alert(123)
}
根据JS中的语法特性(注意哦,是js的语法特点,要记住):
在javascript函数体内(执行作用域)声明的变量,无论在函数体何处声明,它将都会被提升到函数的顶部,我们称这种现象为变量提升。 函数呢,它也有这种特性,即无论在函数体何处声明另一个函数,它将都会被提升到函数的顶部。只是采用函数表达式和函数声明所体现的函数提升的内容是有差别的:函数表达式和变量提升类似,只会提升函数的变量,不提升函数的定义;而函数声明提升时,不仅仅会提升函数的声明,函数的定义也会被提升
根据以上特性,你的代码在执行时,
function a (){
alert(123)
}
这段代码被提升到执行作用域的顶端,最开始被执行;
然后,在执行
var a =function(){
alert('234')
}
这段代码,导致该代码覆盖了前面的函数声明代码;
不信你可以做个测试:
将a()放到js代码的最顶端,可以看看会打印什么结果,此时你就明白了!