JS函式作用域延長的方法

2021-09-28 21:04:07 字數 1808 閱讀 8744

當**在乙個環境中執行時,會建立變數物件的乙個

作用域鏈(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函式內的變數無法在函式外面訪問,在函式內卻可以訪問函式外的...