一、 計時器
? ? ? ? ? ? ? ? 一次性定時器
? ? ? ? ? ? ? ? ? setTimeOut(function(){
? ? ? ? ? //1秒后執(zhí)行
? ? ? ? ? ? ? ? ? },1000)
? ? ? ? ? ? ? ? ? 停止一次性定時器:clearTimeout();
? ? ? ? ? ? ? ? 永久性定時器
? ? ? ? ? ? ? ? ? setInterval(function(){
? ? ? ? ? ? ? ? //1秒后執(zhí)行绵载,并且每隔一秒執(zhí)行一次
? ? ? ? ? ? ? ? ? },1000)
? ? ? ? ? ? ? ? ? 停止永久性定時器的方法:clearInterval();
? ? ? ? 一斩郎、函數(shù)聲明與表達(dá)式
? ? ? ? ? ? 1.函數(shù)聲明
? ? ? ? ? ? function fn(){
? ? ? ? ? ? console.log('hello world');
? ? ? ? ? ? }
? ? ? ? ? ? ? fn();
? ? ? ? ? ? fn();
? ? ? ? ? ? function fn(){
? ? ? ? console.log('HELLO JS');
? ? ? ? }?
? ? ? ? ? ? //函數(shù)的聲明可以把函數(shù)的調(diào)用放在任何位置都可以執(zhí)行
? ? ? ? ? ? 2.函數(shù)表達(dá)式:相當(dāng)于把一個匿名函數(shù)賦值給一? 個變量
? ? ? ? ? ? ? ? var foo=function(){
? ? ? ? ? ? ? console.log('hello function');
? ? ? ? ? }
? ? ? ? ? ? foo();
? ? ? ? ? ? //函數(shù)表達(dá)式中函數(shù)的調(diào)用不可以放在頂部,會報錯
? ? ? ? 二倔监、立即執(zhí)行函數(shù):
? ? ? ? ? ? 我們之前使用的函數(shù)都是先定義劈榨,后調(diào)用。在JavaScript中我們可以定義一個函數(shù)份氧,讓他在定義的時候直接調(diào)用,我們叫他立即執(zhí)行函數(shù)
? ? ? ? ? ? 要想立即執(zhí)行函數(shù)能做到立即執(zhí)行弯屈,要注意兩點蜗帜,
? ? ? ? ? ? 一是函數(shù)體后面要有小括號(),
? ? ? ? ? ? 二是函數(shù)體必須是函數(shù)表達(dá)式而不能是函數(shù)聲明季俩。
? ? ? ? ? ? (function(test){
? ? ? ? ? ? console.log(test);
? ? ? ? ? ? })(123)
? ? ? ? ? ? !(function(test){
? ? ? ? ? ? console.log(test);
? ? ? ? ? ? })(123)
? ? ? ? ? ? +(function(test){
? ? ? ? ? ? console.log(test);
? ? ? ? ? ? })(123)
? ? ? ? ? ? -(function(test){
? ? ? ? ? ? console.log(test);
? ? ? ? ? ? })(123)
? ? ? ? ? ? ? var fun=function(test){
? ? ? ? ? ? console.log(test);
? ? ? ? ? ? }(123456);
? ? ? ? ? ? 除了使用()運算符之外钮糖,梅掠!酌住,+,-阎抒,=等運算符都能起到立即執(zhí)行的作用酪我。這些運算符的作用就是將匿名函數(shù)或函數(shù)聲明轉(zhuǎn)換為函數(shù)表達(dá)式
? ? ? ? ? for(var i=0;i<10;i++){
? ? ? ? setTimeout(function(){
? ? ? ? ? ? console.log(i);
? ? },1000)
? ? ? ? ? 上面的代碼不會輸出數(shù)字 0 到 9,而是會輸出數(shù)字 10 十次且叁。
? ? ? 閉包是依賴于函數(shù)的都哭,因為函數(shù)是js中唯一擁有自身作用域的結(jié)構(gòu)
? ? ? ? ? 函數(shù)的作用域:
? ? ? ? ? ? ? ? function fn1(){
? ? ? ? ? ? ? ? var a=100;
? ? ? ? ? ? ? ? console.log(a);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? fn1();
? ? ? ? ? ? ? ? function fn2(){
? ? ? ? ? ? ? ? ? var b=200;
? ? ? ? ? ? ? ? ? console.log(2);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? fn2();
? ? ? ? ? ? ? ? 兩個單獨的函數(shù),分別都有自己的作用域逞带,并且只能訪問自己作用域中的變量欺矫,而無法訪問其他作用域中的變量
? ? ? ? ? ? ? ? 如果想要兩個函數(shù)訪問其他函數(shù)作用域中的變量,這時候就需要函數(shù)的嵌套展氓。這時候就會形成閉包
? ? ? ? ? ? ? ? 閉包:閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)穆趴,也就是說,當(dāng)函數(shù)嵌套的時候遇汞,我們可以叫內(nèi)部函數(shù)為閉包未妹,利用閉包的特性,我們可以通過返回值的方式得到內(nèi)部函數(shù)中的變量
? ? ? ? ? ? ? ? function fn1(){
? ? ? ? ? ? ? ? var a=100;
? ? ? ? ? ? ? ? console.log(a);
? ? ? ? ? ? ? ? function fn2(){
? ? ? ? ? ? ? ? ? ? var b=10;
? ? ? ? ? ? ? ? ? ? console.log(b);
? ? ? ? ? ? ? ? ? ? console.log(a);
? ? ? ? ? ? ? ? ? ? return b;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return fn2;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? fn1();
? ? ? ? ? ? ? ? function fun1(){
? ? ? ? ? ? ? ? ? var m=3;
? ? ? ? ? ? ? ? ? function fun2(){
? ? ? ? ? ? ? ? ? ? var n=5;
? ? ? ? ? ? ? ? ? ? return n;
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? return fun2()
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? console.log(fun1);//5
? ? ? ? ? ? return n 相當(dāng)于把n的值給了fun2函數(shù)簿废,所以先在fun2函數(shù)的值就是5.再return fun2就相當(dāng)于把fun2的值再給了函數(shù)fun1;所以最后輸出fun1的值為5
? ? ? ? ? ? 上面的代碼中,我們通過兩個返回值把內(nèi)部函數(shù)的變量暴露出來络它,讓全局作用域可以獲取到這個變量族檬,我們還可以進(jìn)一步改變代碼,讓內(nèi)部函數(shù)暴露化戳,而不是讓內(nèi)部函數(shù)中的變量暴露
? ? ? ? ? ? function fun1(){
? ? ? ? ? ? ? var n=5;
? ? ? ? ? ? function fun2(){
? ? ? ? ? ? ? var m=3;
? ? ? ? ? ? ? return m;
? ? ? ? ? ? }
? ? ? ? ? ? return fun2;
? ? ? ? ? ? }
? ? ? ? ? ? console.log(fun1());