一:函数的三种构造形式
函数声明
1. function foo(){}
2. (function foo(){}) //函数表达式
3. !function foo2(){ //函数表达式
console.log('cc')
}
1. 不可以匿名
2. 在执行上下文中会进行声明前置,并且会覆盖前面的声明
3. 不可以立即执行
4. 可以通过函数名访问
函数表达式
1. var foo = function (){} //匿名函数表达式
2. var foo = function test(){}
//立即执行
var foo = function(){
console.log('foo')
}()
var foo1 = function aa(){
console.log('aa')
}()
!function (){
var aa= '222'
console.log(aa)
}()
1. 可以匿名
2. 不会变量前置
3. 可以立即执行
函数构造器
var foo = new Function(a,b,console.log(a+b))
var foo = Function(a,b,console.log(a+b))
Function("var a = '123';console.log(a)")() //123
1. 没有名称
2. 不能访问局部变量,可以访问全局变量
3. 可以立即调用
二:this
var o = {
a:3,
f:function(){
console.log(this.a +this.b)
}
}
var p = Object.create(o) // p.__proto__ -> o
console.log(p.constructor,p.__proto__) //[Function: Object] { f: [Function: f] }
p.a =1
p.b =2
p.f() //3 this -> P 对象
三:函数的属性
function foo(a,b,c){
console.log(arguments.length,arguments[0])
}
console.log(foo.name,foo.length) // foo, 3
foo(1,2) // 2,1
四:apply、call、bind
function foo(c,d){
console.log(this.a+this.b+c+d)
}
var o = {a:1,b:2}
foo.call(o,3,4) //this - >o
五:闭包
六:函数执行上下文、变量对象、激活对象
VO对象,用于存储执行上下文中的变量、函数声明
函数VO按照如下顺序填充
// 1.函数参数
// 2.函数声明前置,如果出现命名冲突,会覆盖
// 3.变量声明前置,如果出现命名冲突会被忽略