天天看點

js的作用域鍊(1)

js是依靠作用域鍊來進行運作的,上一篇講了作用域運作的機制,現在來講講作用域和作用域鍊。

全局作用域

js的最外層函數,和最外層定義的變量都擁有全局作用域。下面看一個例子:

var authorName="山邊小溪";
function doSomething(){
    var blogName="夢想天空";
    function innerSay(){
        alert(blogName);
    }
    innerSay();
}
alert(authorName); //山邊小溪
alert(blogName); //腳本錯誤
doSomething(); //夢想天空
innerSay() //腳本錯誤      

還有一點是未定義直接指派的變量自動被提升為全局變量比如:

function doSomething(){
    var authorName="山邊小溪";
    blogName="夢想天空";
    alert(authorName);
}
doSomething(); //山邊小溪
alert(blogName); //夢想天空
alert(authorName); //腳本錯誤      

再就是window屬性具有全局作用域,這就引出下面的document的例子了:

function changeColor(){
    document.getElementById("btnChange").onclick=function(){
        document.getElementById("targetCanvas").style.backgroundColor="red";
    };
}
```,
這裡的document就是全局作用域,标志符的位置越深,執行的效率就會越慢,是以因為document處于運作期上下文的最末端,是以查找起來最慢,是以要少用全局變量,盡可能多的使用局部變量,這裡有一個經驗就是一個跨作用域的變量使用了兩次以上就要把他儲存在局部變量中,例如下面的代碼:





<div class="se-preview-section-delimiter"></div>      

這裡寫代碼片

“`

function changeColor(){
    document.getElementById("btnChange").onclick=function(){
        document.getElementById("targetCanvas").style.backgroundColor="red";
    };
}      

把他改為:

function changeColor(){
    var doc=document;
    doc.getElementById("btnChange").onclick=function(){
        doc.getElementById("targetCanvas").style.backgroundColor="red";
    };
}      

還有一點是少用with,雖然with可以省代碼,但是他會有另外一個作用域鍊,不利于性能,是以不推薦使用。

try{
    doSomething();
}catch(ex){
    handleError(ex); //委托給處理器方法      

繼續閱讀