當**在乙個環境中執行時,會建立變數物件的乙個
作用域鏈(scope chain)
。作用域鏈的用途,是保證對執行環境有權訪問的所有變數和函式的有序訪問。作用域鏈的前端,始終都是當前執行的**所在環境的變數物件。如果這個環境是函式,則將其
活動物件(activation object)
作為變數物件。活動物件在最開始時只包含乙個變數,即 arguments
物件(這個物件在全域性環境中是不存在的)。作用域鏈中的下乙個變數物件來自包含(外部)環境,而再下乙個變數物件則來自下乙個包含環境。這樣,一直延續到全域性執行環境;全域性執行環境的變數物件始終都是作用域鏈中的最後乙個物件。
var color = "blue";
function changecolor() else
} changecolor();
alert("color is now " + color);
在這個簡單的例子中,函式
changecolor()
的作用域鏈包含兩個物件:它自己的變數物件(其中定義著 arguments
物件)和全域性環境的變數物件。可以在函式內部訪問變數
color
,就是因為可以在這個作用域鏈中找到它。
雖然執行環境的型別總共只有兩種——全域性和區域性(函式),但還是有其他辦法來延長作用域鏈。這兩個語句都會在作用域鏈的前端新增乙個變數物件:try-catch
語句的
catch 塊;
with 語句。
例如:
function buildurl()
return url;
}
這裡with接受對是location物件,那麼locatiion物件中對屬性方法就被新增到了函式到作用域前端。因此函式buildurl可以引用location的href(實際上上location.href)
例如:
function sum(num1, num2)
function callsum1(num1, num2)
function callsum2(num1, num2)
alert(callsum1(10,10)); //20
alert(callsum2(10,10)); //20
這樣,callsum1和callsum2就可以呼叫本來在全域性中定義的sum 函式了。
例如
function sum(num1, num2)
function callsum(num1, num2)
alert(callsum(10,10)); //20
window.color = "red";
var o = ;
function saycolor()
saycolor(); //red
saycolor.call(this); //red
saycolor.call(window); //red
saycolor.call(o); //blue
使用call為函式saycolor指定作用域,當指定的作用域為o時,本來的alert(this.color)指向的就是物件o中的color。
window.color = "red";
var o = ;
function saycolor()
var objectsaycolor = saycolor.bind(o);
objectsaycolor(); //blue
js 延長作用域
延長作用域 1 with語句 function buildurl window person with語句可以延長js變數作用域,使用var 申名的變數會新增到最近接的環境 url被新增到buildurl函式環境就是與buildurl環境平級,而不是with語句塊環境 with window ret...
js延長作用域鏈
雖然執行環境的型別只有全域性函式和區域性函式,但還是有其他辦法來延長作用域的。實現的原理是有些一句可以在作用域的前端臨時加乙個變數物件,該變數物件會在 執行後被移除。有兩種情況可以達到這種效果 try catch語句的catch塊 with語句 上面兩個語句都會在作用域的前端新增乙個變數物件。對wi...
js函式作用域
js的變數作用域是函式級的,在js裡沒有類似c語言的塊級作用域。js程式設計環境的頂級作用域是window物件下的範圍,稱為全域性作用域,全域性作用域中的變數稱為全域性變數。js中的全域性變數相當於js中頂級作用域 window 的屬性。js函式內的變數無法在函式外面訪問,在函式內卻可以訪問函式外的...