函数调用
首先用function 声明一个函数
function sayHello(){ //sayHello 是一个函数名
console.log('zhouyi') //里面的是函数体
}
sayHello() // zhouyi 调用函数名,打印出结果,如果不调用不会打印结果
声明不必放调用前面
sayHello()
function sayHello(){
console.log('zhouyi')
}
这样也是可以的,但是中间不能有其他的函数。
函数调用
var sayHello = function(){
console.log('zhouyi')
}
sayHello()
在函数调用里面,声明必须放调用的前面。因为相当于把函数当成一个值,只不过值的内容是一个函数,然后调用的时候,你要有值才能去调用,所以,声明必须放调用的前面。
声明前置,
在一个作用域下,var 声明的变量和function声明的函数会前置
不加var作用
不加var 会声明一个全局变量,如果真的需要一个全局变量,也应该在最外层 作用域使用var声明。
function fn(){
a = 1 ;
}
fn();
console.log(a); //1
立即执行函数表达式:声明一个匿名函数,然后立即执行。这是它的2种写法
(function(){ /* code */ })();
!function(){ /* code */}();
(function(){
var a = 1;
})()
console.log(a);//undefined
因为a是独立作用域下的a,只是做了个声明,和console.log(a)没有半毛钱关系。
作用,隔离作用域,避免全局变量
function fn(){
var a ;
a =1;
console.log(a);
}
fn()
等同于
(function(){
var a ;
a =1;
console.log(a);
})()
另一种写法,
!function(){
var a ;
a =1;
console.log(a);
}()
创建独立作用域,隔离外部变量,不受干扰。
注:“!”可以是任何单个符合,例如!@#¥%,不能用()、'、"这样的符号
还有种情况
function fn(i,j){}
类似于,但不是完全等价于
function fn(){
var fn = arguments[0];
var fn = arguments[1];
}
举个例子
var a = 100;
!function(a){
a =1;
}(/*没有传参*/)
console.log(a); //100
因为a没有传参数,而且a没有打印, console.log(a)打印的是全局变量a,结果输出为100。
假如a传参了,如下所示
var a = 100;
!function(a){
console.log(a)// 打印的的第一个数99
}(99)
console.log(a); //打印的的第二个数100
- 首先第一个console.log(a)会打印99,因为是立即执行函数,会立即执行,它和外面的a没有半毛钱关系,是独立作用域下的a,然后传参99,所以输出结果为99。
- 其次第二个console.log(a)会打印出100,是全局作用域下a的值。
同样的,再举个例子
var a = 100;
!function(a){
console.log(a)// 100
}(a)
为什么是这样呢,因为console.log(a)打印出来的是函数中的a,只是后面传的参数是全局变量中的a,由于全局变量中声明了a并赋值100,所以打印出来的值也是100。立即执行函数里的a和全局变量中的a,没有半毛钱关系,只是刚好传参进去了而已。