您好,登錄后才能下訂單哦!
var?x?=?1; test(); function?test(){ ????console.log(x)?//1 } function?test(){ ????console.log(x)?//undefined ????var?x?=?10; } function?test(){ ????console.log(x)?//1 ????x?=?10; ????console.log(x)?//10 }
大前提:Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定變量的作用域
第一種test寫法? X先在外層被聲明了全局作用域?執行到test的時候 X作用域沒有變 直接打印全局x
第二種test寫法? X先在外層被聲明了全局作用域 執行到test時候 x作用域被聲明為局部作用域 而此時局部作用域的x并沒有賦值? 賦值是在console之后才發生的
第三種test寫法? X先在外層被聲明了全局作用域 執行到test的時候 X沒有被聲明為局部作用域? 所以x仍然為全局作用域 故第一個可以打印出1
可以這樣理解 在執行方法的時候 第一步執行的是變量的聲明? 然后才是后面的邏輯代碼
var?x?=?1 function?test(){ ????alert('ok') ????console.log('ok') ????var?x?=?100 } function?test(){ ????var?x; ????alert('ok') ????console.log('ok') ????x=100; }
上面第二種test就是第一種test在JS解析時候的執行過程 執行到test方法時 先把聲明變量的部分挪到前面 確定變量的作用域; 賦值的地方不變; 第二種test x=100 此時的X只是局部賦值
函數內容的var是局部賦值 不帶var的直接賦值是全局的
function?test(){ ????x=?1 } console.log(x)//undefined test(); console.log(x)//1
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。