成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

setTimeout與console.log()執(zhí)行順序,局部變量和全局變量,var變量提升,thi

RyanHoo / 1840人閱讀

摘要:等價(jià)于彈出全局變量和局部變量的區(qū)別的變量的是根據(jù)方法塊來(lái)劃分的也就是說(shuō)以的一對(duì)大括號(hào)來(lái)劃分。在函數(shù)內(nèi)部,如果沒(méi)有用進(jìn)行申明,則創(chuàng)建的變量是全局變量,而不是局部變量了。

令人心痛的血淋淋教訓(xùn),再犯這些錯(cuò)誤我不是人。

setTimeout與console.log()執(zhí)行順序
setTimeout延時(shí)為0時(shí),
    setTimeout(function(){
        console.log(2);
    },0);
    console.log(1);
    //輸出順序:1,2
    
     setTimeout(function(){
        console.log(4);
    },0);
    setTimeout(function(){
        console.log(5);
    },0);
    console.log(1);
    console.log(2);
    console.log(3);
    //輸出順序:1,2,3,4,5

原因:(記住嘍,記不住打死你?。。。?/strong>:頁(yè)面中所有由setTimeout定義的操作,都將放在同一個(gè)隊(duì)列中依次執(zhí)行。而這個(gè)隊(duì)列的執(zhí)行時(shí)間需要等到函數(shù)調(diào)用棧執(zhí)行完畢后才會(huì)執(zhí)行,也就是等待所有的可執(zhí)行代碼執(zhí)行完畢,才會(huì)輪到setTimeout執(zhí)行其內(nèi)部操作,并且按照其時(shí)延時(shí)間長(zhǎng)短順序執(zhí)行代碼!

再來(lái)個(gè)高深的:瞅著

setTimeout(function(){
        console.log("a:"+a);
    },0);
    var a = 1;
    console.log("b:"+b);
    var b = 2;
    var c = 3;
    var d = 4;
    var e = 5;
    function fx(c){
        console.log("c:"+c);
    }
    function fn(e,d){
        console.log("d:"+d);
        setTimeout(function(){
            console.log("e:"+e);
        },10);
    }
    setTimeout(function(){
        console.log("b2:"+b);
    },20);
    fn(e,d);
    fx(c);
    

輸出結(jié)果:

原因:
1、console.log()函數(shù)會(huì)在setTimeout函數(shù)之前執(zhí)行,并且b在輸出之前未被定義所以最先輸出undefined;
2、之后,會(huì)執(zhí)行fn函數(shù)和fx函數(shù),而fn函數(shù)內(nèi)存在console.log函數(shù),那么它將會(huì)先輸出d的值4;
3、然后,在fx函數(shù)內(nèi)也存在console.log函數(shù),同樣會(huì)先輸出c的值3;
4、再來(lái)比較setTimeout函數(shù)時(shí)延長(zhǎng)短,依次輸出1,5,2。

3)

for (var i = 0; i < 3; i++) {
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
}
//0 1 2 3 3 3
用到了閉包

4)

for (var i = 0; i < 3; i++) {}
console.log(i); 
//3,也就說(shuō)i可以在for循環(huán)體外訪問(wèn)到。所以是沒(méi)有塊級(jí)作用域。    

5)

var i = 0;
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
i++;
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
i++;
setTimeout(function() {
    console.log(i);
}, 0);
console.log(i);
i++;    

等價(jià)于:
var i = 0;
console.log(i);
i++;
console.log(i);
i++;
console.log(i);
i++;
setTimeout(function() {
    console.log(i);
}, 0);
setTimeout(function() {
    console.log(i);
}, 0);
setTimeout(function() {
    console.log(i);
}, 0);  //彈出 0 1 2 3 3 3
全局變量和局部變量的區(qū)別

1)

    var a = "Hello";
    function test(){
        var a;
        alert(a);
        a = "World";
        alert(a);
    }
    test();//undefined world

2)

     var a = "Hello";
    function test(){
        alert(a);
        a = "World";
        alert(a);
    }
    test();//Hello World
   

3)

    var a =1;
    function test(){
        alert(a);
        var a = 2;
        alert(a);
    }
    test();
    alert(a); //undefined 2 1        

Javascript的變量的scope是根據(jù)方法塊來(lái)劃分的(也就是說(shuō)以function的一對(duì)大括號(hào){ }來(lái)劃分)。是function塊,而for、while、if塊并不是作用域的劃分標(biāo)準(zhǔn),可以看看以下幾個(gè)例子:

   function?test2(){??????
   alert?("before?for?scope:"+i);????
      //?i未賦值(并不是未聲明!使用未聲明的變量或函數(shù)全拋出致命錯(cuò)誤而中斷腳本執(zhí)行)???????//?此時(shí)i的值是underfined??????
   for(var?i=0;i<3;i++){??????????
       alert("in?for?scope:"+i);??//?i的值是?0、1、2,?當(dāng)i為3時(shí)跳出循環(huán)??????
       }?????
   alert("after?for?scope:"+i);??//?i的值是3,注意,此時(shí)已經(jīng)在for?scope以外,但i的值仍然保留為3????????????
   while(true){??????????
       var?j?=?1;??????????
       break;??????
       }??????
       alert(j);????
       //?j的值是1,注意,此時(shí)已經(jīng)在while?scope以外,但j的值仍然保留為1????????
       if(true){??????????
           var?k?=?2;??????
           }??????
       alert(k);??//k的值是1,注意,此時(shí)已經(jīng)在if?scope以外,但k的值仍然保留為1??
   }??
   test2();??
   //若在此時(shí)(function?scope之外)再輸出只存在于test2?這個(gè)function?scope里的?i、j、k變量會(huì)發(fā)生神馬效果呢???
   alert(i);?//error!?沒(méi)錯(cuò),是error,原因是變量i未聲明(并不是未賦值,區(qū)分test2函數(shù)的第一行輸出),導(dǎo)致腳本錯(cuò)誤,程序到此結(jié)束!??
   alert("這行打印還會(huì)輸出嗎?"+i);?//未執(zhí)行??
   alert(j);?//未執(zhí)行??
   alert(k);?//未執(zhí)行
   

Javascript在執(zhí)行前會(huì)對(duì)整個(gè)腳本文件的聲明部分做完整分析(包括局部變量),從而確定實(shí)變量的作用域。怎么理解呢?看下面一個(gè)例子:

 var?a?=1;?????
 function?test(){??????????
      alert(a);?//a為undefined!?這個(gè)a并不是全局變量,這是因?yàn)樵趂unction?scope里已經(jīng)聲明了(函數(shù)體倒數(shù)第4行)一個(gè)重名的局部變量,???????????????????????
      //所以全局變量a被覆蓋了,這說(shuō)明了Javascript在執(zhí)行前會(huì)對(duì)整個(gè)腳本文件的定義部分做完整分析,所以在函數(shù)test()執(zhí)行前,???????????????????????
      //函數(shù)體中的變量a就被指向內(nèi)部的局部變量.而不是指向外部的全局變量.?但這時(shí)a只有聲明,還沒(méi)賦值,所以輸出undefined。??????????
      a=4;?????????????????
       alert(a);??//a為4,沒(méi)懸念了吧??這里的a還是局部變量哦!??????????
       var?a;?????//局部變量a在這行聲明??????????
       alert(a);??//a還是為4,這是因?yàn)橹耙寻?賦給a了??????
       }??????
       test();??????
       alert(a);?//a為1,這里并不在function?scope內(nèi),a的值為全局變量的值?
       

當(dāng)全局變量跟局部變量重名時(shí),局部變量的scope會(huì)覆蓋掉全局變量的scope,當(dāng)離開(kāi)局部變量的scope后,又重回到全局變量的scope,而當(dāng)全局變量遇上局部變量時(shí),怎樣使用全局變量呢?用window.globalVariableName。

   var?a?=1;??????
   function?test(){?????????????
       alert(window.a);??//a為1,這里的a是全局變量哦!??????????
       var?a=2;?????//局部變量a在這行定義??????????
       alert(a);??//a為2,這里的a是局部變量哦!??????
       }??????
  test();??????
  alert(a);?//a為1,這里并不在function?scope內(nèi),a的值為全局變量的值

**總結(jié):(每個(gè)例子慢慢看,就全懂了)
1、js有兩級(jí)作用域,全局和局部,局部也叫函數(shù)作用域
2、全局作用域的變量局部可以使用,局部作用域的變量只能在函數(shù)體內(nèi)使用
3、var和function聲明的變量都聲明提前,賦值留在原地
4、如果局部和全局變量重名,優(yōu)先使用局部變量
5、第3條和第4條,解釋了全局和局部都有相同變量名的時(shí)候,而在函數(shù)體內(nèi)打印的變量是undefined**

var變量提升(這個(gè)問(wèn)題我一直一知半解,現(xiàn)在懂了)
一般情況下,是可以省略var的,但有兩點(diǎn)值得注意:
1、var a=1 與 a=1 ,這兩條語(yǔ)句一般情況下作用是一樣的。但是前者不能用delete刪除。不過(guò),絕大多數(shù)情況下,這種差異是可以忽略的。
2、在函數(shù)內(nèi)部,如果沒(méi)有用var 進(jìn)行申明,則創(chuàng)建的變量是**全局變量,而不是局部變量**了。所以,建議變量申明加上var關(guān)鍵字。

瞅著:
1)

    var t = 1; 
    function a(){
        console.log(t);
        var t=2;
    }
    a();//undefined;

輸出undefined,原因:function()中相當(dāng)于

var t;
console.log(t);
t = 2;
表示變量t已聲明,但還未賦值,輸出undefined。

2)

但是變量提升只對(duì)var命令聲明的變量有效,如果一個(gè)變量不是用var命令聲明的,就不會(huì)發(fā)生變量提升。
console.log(aa);
aa =1;
以上代碼將會(huì)報(bào)錯(cuò):ReferenceError: aa is not defined。

3)

var t = 1;
    function a(){
        console.log(t);
        t=2;
    }
    a();//1

4)

函數(shù)聲明變量提升
foo();
function foo(){
    console.log("aaa");
}
//輸出aaa

原因:函數(shù)聲明提升 (函數(shù)聲明提升直接把整個(gè)函數(shù)提到執(zhí)行環(huán)境的最頂端)
它相當(dāng)于
function foo(){
    console.log("aaa");
}
foo();
    

5)

foo();
var foo = function(){
    console.log("aaa");
} 
它相當(dāng)于:
var foo;
foo(); //foo is not a function
foo = function(){
        console.log("aaa");
    }          
上面代碼輸出undefined 是因?yàn)樽兞刻嵘蟛](méi)有賦值因此輸出undefined

輸出foo is not a function 原因是:js解析遇到 foo()時(shí)會(huì)默認(rèn)當(dāng)做函數(shù)來(lái)解析

6)最厲害的一個(gè)

console.log(foo);
var foo=10;
console.log(foo);
function foo(){
    console.log(10);
}
console.log(foo);

他相當(dāng)于:
function foo(){
    console.log(10);
}
var foo;
console.log(foo);
foo=10;
console.log(foo);
console.log(foo);

函數(shù)提升在變量提升上面,第一個(gè)console.log(foo);為什么會(huì)輸出函數(shù)題呢,原因在于 var foo; 并未有賦值只是聲明,因此他會(huì)調(diào)用上面的值.

this指向

   全局環(huán)境中,this指向window
   console.log(this.document === document); // true
   
   // 在瀏覽器中,全局對(duì)象為 window 對(duì)象:
   console.log(this === window); // true
   
   this.a = 37;
   console.log(window.a); // 37

函數(shù)調(diào)用
非嚴(yán)格模式下,this 默認(rèn)指向全局對(duì)象window

   function f1(){
     return this
   f1() === window; // true

   而嚴(yán)格模式下, this為undefined
   function f2(){
     "use strict"; // 這里是嚴(yán)格模式
     return this;
   }    
   f2() === undefined; // true

1)

   對(duì)象中的this
     var o = {
     user:"李鋼鐵",
     fn:function(){
           console.log(this.user);  //李鋼鐵
       }
   }
   o.fn();

這里的this指向的是對(duì)象o,因?yàn)槟阏{(diào)用這個(gè)fn是通過(guò)o.fn()執(zhí)行的,那自然指向就是對(duì)象o,這里再次強(qiáng)調(diào)一點(diǎn),this的指向在函數(shù)創(chuàng)建的時(shí)候是決定不了的,在調(diào)用的時(shí)候才能決定,誰(shuí)調(diào)用的就指向誰(shuí),一定要搞清楚這個(gè)。

2).

var o = {
user:"李鋼鐵",
fn:function(){
    console.log(this.user); //李鋼鐵
}
}
window.o.fn();
this指向o

3).

var o = {
  a:10,
  b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn();

總結(jié):如果一個(gè)函數(shù)中有this,這個(gè)函數(shù)有被上一級(jí)的對(duì)象所調(diào)用,那么this指向的就是上一級(jí)的對(duì)象。

4).

 var o = {
a:10,
b:{
    // a:12,
    fn:function(){
        console.log(this.a); //undefined
    }
   }
}
o.b.fn();
this指向b,因?yàn)閠his只會(huì)指向它的上一級(jí)對(duì)象,不管這個(gè)對(duì)象中有沒(méi)有this要的東西。

5).

特殊情況
var o = {
a:10,
b:{
    a:12,
    fn:function(){
        console.log(this.a); //undefined
        console.log(this); //window
    }
}
}
var j = o.b.fn;
j();

這里this指向的是window,,this永遠(yuǎn)指向的是最后調(diào)用它的對(duì)象,也就是看它執(zhí)行的時(shí)候是誰(shuí)調(diào)用的,例子4中雖然函數(shù)fn是被對(duì)象b所引用,但是在將fn賦值給變量j的時(shí)候并沒(méi)有執(zhí)行所以最終指向的是window。

4.

構(gòu)造函數(shù)中this
function Fn(){
this.user = "李鋼鐵";
    }
var a = new Fn();
console.log(a.user); //李鋼鐵
指向?qū)嵗瘜?duì)象a

當(dāng)this遇到return時(shí),如果返回值是一個(gè)對(duì)象,那么this指向的就是那個(gè)返回的對(duì)象,如果返回值不是一個(gè)對(duì)象那么this還是指向函數(shù)的實(shí)例。

function fn()  
{  
    this.user = "李鋼鐵";  
    return undefined;
}
var a = new fn;  
console.log(a); 
//fn {user: "李鋼鐵"}

    function fn()  
{  
    this.user = "李鋼鐵";  
    return 1;
}
var a = new fn;  
console.log(a.user); 
//李鋼鐵

特殊情況:雖然null也是對(duì)象,但是在這里this還是指向那個(gè)函數(shù)的實(shí)例,因?yàn)閚ull比較特殊。
function fn()  
{  
    this.user = "李鋼鐵";  
    return null;
}
var a = new fn;  
console.log(a.user); //李鋼鐵

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/98201.html

相關(guān)文章

  • JS筆記四:作用域、變量(函數(shù))提升

    摘要:變量作用域一個(gè)變量的作用域表示這個(gè)變量存在的上下文。在這種情況下,僅僅函數(shù)聲明的函數(shù)體被提升到頂部。雖然我們無(wú)需用來(lái)修飾形式參數(shù),但是形式參數(shù)的確也是變量,并且被自動(dòng)提升到次高的優(yōu)先級(jí)函數(shù)聲明。 關(guān)于作用域,變量提升,函數(shù)提升的個(gè)人理解 參考: 阮一峰的JavaScript參考教程2.7函數(shù)部分 思否上一篇關(guān)于作用域,提升的博客 一篇關(guān)于作用域和提升的個(gè)人博客 MockingBird...

    FuisonDesign 評(píng)論0 收藏0
  • Nodejs中的一些小trick

    摘要:要達(dá)到想要的效果正確的做法是即用來(lái)產(chǎn)生一個(gè)立即作用域,保證回調(diào)函數(shù)執(zhí)行的時(shí)候最近的原型作用域的就是當(dāng)時(shí)循環(huán)的。判斷數(shù)組中是否存在滿足條件的項(xiàng),只要有一項(xiàng)滿足條件,就會(huì)返回。 之前常常因?yàn)椴蛔⒁?,?xí)慣用寫(xiě)PHP或者Java的方式來(lái)寫(xiě)nodejs,產(chǎn)生了了一些錯(cuò)誤,這里總結(jié)一些小小的trick,以便于展示nodejs的不同,和平時(shí)需要注意的地方。 變量提升 var variable = g...

    tomorrowwu 評(píng)論0 收藏0
  • 由兩道題擴(kuò)展的對(duì)作用域,作用域鏈,閉包,立即執(zhí)行函數(shù),匿名函數(shù)的認(rèn)識(shí)總結(jié)

    摘要:前言最近在學(xué)前幾天看到兩道題剛開(kāi)始看懵懵懂懂這幾天通過(guò)各種查資料慢慢的理解頓悟了對(duì)匿名函數(shù)閉包立即執(zhí)行函數(shù)的理解也更深了一點(diǎn)在此分享給大家我的理解與總結(jié)希望能幫助大家理解因?yàn)檫@篇文章是我用心總結(jié)的查閱了很多的資料所以總結(jié)的比較細(xì)篇幅較長(zhǎng)如果 前言 最近在學(xué)JS,前幾天看到兩道題,剛開(kāi)始看懵懵懂懂,這幾天通過(guò)各種查資料,慢慢的理解,頓悟了,對(duì)匿名函數(shù),閉包,立即執(zhí)行函數(shù)的理解也更深了一點(diǎn)...

    piapia 評(píng)論0 收藏0
  • JS語(yǔ)言缺陷

    摘要:語(yǔ)言缺陷是一門在極短時(shí)間里創(chuàng)造的腳本語(yǔ)言,它存在很多的不足,這使得在學(xué)習(xí)時(shí)無(wú)形加大了學(xué)習(xí)的難度,本文就將這些內(nèi)容進(jìn)行總結(jié),以防繼續(xù)掉坑。 JS語(yǔ)言缺陷 js是一門在極短時(shí)間里創(chuàng)造的腳本語(yǔ)言,它存在很多的不足,這使得在學(xué)習(xí)時(shí)無(wú)形加大了學(xué)習(xí)的難度,本文就將這些內(nèi)容進(jìn)行總結(jié),以防繼續(xù)掉坑。 1.變量提升 1.1 案例分析 先來(lái)說(shuō)一下變量提升,它其實(shí)就是先用后聲明,經(jīng)常被拿來(lái)說(shuō)明的一個(gè)例子是:...

    I_Am 評(píng)論0 收藏0
  • 老生常談—Javascript作用域、變量提升、閉包

    摘要:局部變量在函數(shù)中聲明的變量,函數(shù)的參數(shù)作用域是局部性的,在函數(shù)體外,或者說(shuō)的當(dāng)前作用域的上層是無(wú)法直接讀取的。執(zhí)行結(jié)果這樣我們就在外層取得了函數(shù)內(nèi)部局部變量的也就是閉包實(shí)現(xiàn)從外部讀取局部變量的能力。 淺談作用域 ??當(dāng)我們新建一個(gè)可以儲(chǔ)存變量的值,怎么才能讀取到這個(gè)變量呢?能訪問(wèn)到這個(gè)變量,就說(shuō)明符合作用域規(guī)則,作用域規(guī)則就可以說(shuō)是js引擎讀取變量的規(guī)則。??在js中變量分為兩種,全局...

    zhiwei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<