函数定义的过程
1、声明函数 function fn( ){ console.log(123) } 2、函数表达式 var fun = function( ){ console.log(123) } 3、ES6箭头函数 var fn = x => x * x;
声明式函数可以再声明之前调用 函数表达式不能在声明式之前调用,但都可以在声明之后调用
function fn(){ console.log(123) } var fun = function(){ console.log(456) }
只要写了 函数名( ) 都是函数立即调用
function fn(){ console.log(123) } function fun(){ console.log(123) } console.log(fn == fun) //false console.log(fn === fun) //false //fn 是函数的名字(实际保存的就是这个空间的地址)
function fn(num1,num2){ console.log(arguments) console.log(arguments.length) //arguments就是实参的集合 } fn(1,2,3)
eg:求任意几个数的和,因为不确定有几个参数,所以不用形参
function fn( ){ var sum = 0 for(var i = 0; i < arguments.length; i++){ sum +=arguments[i] } consloe.log(sum) } fn()
我调用这个函数 只希望你把这个结果给我,至于我拿到这个结果要干什么你不管
function fn(){ console.log("我是 fn 函数") } var res = fn() //undefined 代表这个函数执行完毕的结果就是undefined function fn(){ return "我是 fn 函数" } var res = fn() console.log("这是我拿到的结果" + res)
函数有且只有一个返回值,后面的代码不会执行
函数什么时候写 return 什么时候不写 return ?
1、调用函数以后,希望拿到一个结果,需要写 return
2、调用这个函数,只希望它去执行一段代码,你不需要代码执行完给你返回结果的时候就不用鞋 return
在执行代码之前,浏览器会把所有的代码先通读解释一遍 变量提升 1、var 2、声明式函数
例1:
var a = 10 console.log(a) function a( ){ console.log("我是 a 函数") } a() 预解析: 1、在全局声明一个变量 a 可用 2、在全局声明一个变量 a 可用 并且是一个函数的地址 代码执行:1、 a = 10 2、console.log(a) 3、a()
例2:
var a = 100 function a(){ var b = 10 console.log("我是 a 函数") } a() var a = function(){ console.log("我是函数表达式 a") } a = 200 a() 预解析: 1、全局声明一个变量 a 可用 2、全局声明一个变量 a 可用 并且是一个函数的地址 3、全局声明一个变量 a 可用 经过上面的预解析以后,全局有且只有一个 a 并且是一个函数的地址 代码执行: 1、a = 100 2、a() 100() => a is not a function 报错停止执行代码
预解析的无节操性
if(false){ var a = 100 } console.log(a) //undefined 预解析: 1、全局声明一个变量 a 可用 代码执行: 1、console.log(a) //undefined
function a() { console.log(b) return var b = 10 } a() //undefined
变量起作用的范围
作用域的访问规则:
作用域赋值规则: