js改變做用域鏈

js有兩種做用域:全局和局部前端

在最外層定義的變量擁有全局做用域,對任何內部函數來講,都是能夠訪問的;而局部做用域則只有內部函數定義的變量才擁有;在函數內部定義變量時,要使用var,不然定義的變量時全局變量函數

js是沒有塊級做用域的,所以for循環中的i在執行完循環後,還能夠被同做用域的代碼獲取。js的做用域都是相對於函數而言,是函數做用域。對象

js的做用域鏈:作用域

每一個函數執行都會生成一個執行環境,全局執行環境是最外圍的執行環境且被認爲是window對象,所以全部全局變量和函數都會做爲window對象的屬性和方法而被建立;當一個函數被調用時,該函數環境的變量對象就會被壓入一個環境棧中。而在函數執行以後,棧將該函數的變量對象彈出,把控制權交給以前的執行環境變量對象it

js如何來延長做用域鏈:io

有三種語句能夠增強做用域鏈:try catch;with;evalfor循環

trycatch中的catch和with語句都會在做用域鏈的前端添加一個變量對象。對with語句來講,將指定的對象添加到做用域鏈中,對catch語句來講,會建立一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明,而eval因爲能夠被賦值給變量,在被賦值的時候會將eval所處的變量做用域也賦值過去,因此能夠使得做用域得到擴展。function

eg:變量

var x=1,evalg=eval;擴展

function a(){

  var x=3;

  eval("alert(x)");//3

  evalg("alert(x)");//1

}

相關文章
相關標籤/搜索