1. 立即执行函数
定义在全局的函数只有关闭浏览器或者退出程序才会释放 IIFE: Immediately-Invoked Function Expression 解决页面加载自动执行 ,执行完成后立即释放 (避免了只会执行一次的内容一直存在于全局) IIFE用匿名函数或者函数声明(会忽略函数名)都是一样的效果,执行完成后立即释放 一定是表达式才能被执行符号执行 表达式会忽略函数名 → 函数表达式如果命名了a,不会被声明连续写2个立即执行函数,要用分号间隔(习惯是在最前面加分号 )
延伸:函数名
总结:找名字无限制,调用有限制 表达式后的函数若有名字a,调用.name打印出a(不管在函数内部还是外部,.name都能获得名字)
var test = function a ( ) { console. log ( arguments. callee) console. log ( test. name) a ( )
}
test ( )
console. log ( test. name)
console. log ( a)
延伸 声明变量test若是匿名函数,调用.name打印出test
var test = function ( ) { console. log ( test. name) console. log ( arguments. callee)
}
test ( )
console. log ( test. name)
var test = function a ( ) { console. log ( arguments. callee)
}
test ( )
console. log ( test. name)
console. log ( a)
题目 -这里可没有函数,无形参,这个题目考的是,表达式会忽略函数名 1h22min
var a = 10 ;
if ( function b ( ) { } ) { a += typeof ( b)
}
console. log ( a)
( function ( ) { } ( ) ) ;
( function ( ) { } ) ( ) ;
( function test ( a, b) { } ) ( 1 , 2 ) ;
var sum = ( function test ( a, b) { return a + b
} ) ( 1 , 2 ) ;
函数声明不能直接调用,会报语法错误 :js将function关键字当做一个函数声明的开始,而函数声明后面不能跟圆括号 函数声明 → 表达式:在前面加 + - ! || &&
function ( ) {
} ( )
function test ( ) { console. log ( 1 )
} ( 1 )
function test ( ) { console. log ( 1 )
}
( 1 )
将 IIFE 分配给一个变量,不是存储 IIFE 本身,而是存储 IIFE 执行后返回的结果 。
var result = ( function ( ) { var name = "Barry" ; return name;
} ) ( ) ;
result;
函数表达式 可以直接加()
调用,也是立即执行 函数声明不行,但表达式可以直接加()
var test = function ( ) {
} ( )
console. log ( test)
var test = function ( ) {
}
console. log ( test)
2. 闭包深入
打印10个10 在test内部var i是局部变量 test执行结束 ,i值为10,且生成了10个闭包每个闭包拉扯着test执行期间的AO(含i、arr ) test执行结束,i值为10 改成立即执行,则不必声明、return arr了,函数执行完就被销毁了
function test ( ) { var arr = [ ] for ( var i = 0 ; i < 10 ; i++ ) { arr[ i] = ( function ( curIdx) { console. log ( curIdx) } ) ( i) ; }
}
test ( )
function test ( ) { var arr = [ ] for ( var i = 0 ; i < 10 ; i++ ) { ( function ( curI) { arr[ i] = function ( ) { console. log ( curI) } } ( i) ) } return arr
}
var myArr = test ( )
console. log ( 'myArr' , myArr)
myArr[ 0 ] ( )
myArr[ 1 ] ( )
myArr[ 2 ] ( )
应用:点击li打印对应的下标 累加器
function add ( ) { var num = 0 return function ( ) { console. log ( ++ num) }
}
var myAdd = add ( )
myAdd ( )
myAdd ( )
myAdd ( )
function classRoom ( ) { var names = [ ] function addStudent ( name) { names. push ( name) console. log ( '加入学生' + name + ',当前名单:' , names) } function leaveStudent ( name) { for ( var i = 0 ; i < names. length; i++ ) { var item = names[ i] if ( item == = name) { names. splice ( i, 1 ) break } } console. log ( '学生' + name + '离开,当前名单:' , names) } return { addStudent: addStudent, leaveStudent: leaveStudent}
}
var myObj = classRoom ( )
var myAdd = myObj. addStudent
var myLeave = myObj. leaveStudent
myAdd ( '东邪' )
myAdd ( '西毒' )
myAdd ( '南帝' )
myAdd ( '北丐' )
myLeave ( '西毒' )
myLeave ( '北丐' )
myAdd ( '中神通' )
3. 逗号运算符
var fn = ( function test1 ( ) { return 1 } , function test2 ( ) { return '1' }
) ( )
console. log ( typeof ( fn) )