一、函数声明的5种方法
- 具名函数
function fun(x,y){ return x+y }
fun.name //'fun'
- 匿名函数
var fun = function(x,y){ return x+y }
fun.name // "fun"
- 具名函数赋值
var f = function f2(x,y){ return x+y }
f.name //'f2'
console.log(f2) // f2 is not defined 注意不是undefined
- window.Function
var f = new Function('x','y','return x+y')
f.name // "anonymous" 匿名
- 箭头函数
假如方法里只有一句话,那么花括号可以省略
var f = (x,y) => { return x+y }
var sum = (x,y) => x+y
var n2 = n => n*n
二、函数的调用
function f1(x,y){
return x+y;
}
//调用方法一
f1(2,3) //5
//调用方法二 推荐这种
f1.call(undefined,3,4) //7
简解:f.call(asThis, input1,input2)
其中 asThis (第一个参数)会被当做 this,
[input1,input2] 会被当做 arguments,arguments是个伪数组
三、函数的this、arguments、返回值
function f(){
'use strict'
console.log(this);
console.log(arguments)
return undefined; // 每个函数都会有个返回值,默认为undefined ,即使你不写,浏览器运行时也会给函数加上
}
f.call(1,2,3) // this 为 1,arguments 为 [2,3]
另外
//在调用call()方法时,第一个参数默认时this,假如第一个参数不填,那么this的值就是undefined
//在非严格模式下,所有函数返回undefined时,浏览器会自动将这个undifined转为window对象
//而在严格模式下,直接返回undefined
function f(){
console.log(this)
}
f.call() //window 这是一个window对象
function f2(){
'use strict'
console.log(this)
}
f2.call() //undefined
四、js的Call stack (调用栈)
五、作用域 && 闭包
- 按照语法树,就近原则
- 我们只能确定变量是哪个变量,但是不能确定变量的值
var a = 1;
function f1(){ console.log(a) }
function f2(){ var a = 2; console.log(a) }
function f3(){ console.log(a);var a = 2; }
f1.call() //1
f2.call() //2
f3.call() //undefined 浏览器读取函数时,先进行变量提升再执行函数的,
如果一个函数,使用了它范围外的变量,那么(这个函数+这个变量)就叫做闭包