最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript作用域和作用域鏈詳解

 更新時間:2022年01月23日 15:41:14   作者:賣菜的小白  
這篇文章主要為大家介紹了javascript作用域和作用域鏈,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、javascript的作用域

1、全局作用域

1、最外層函數(shù)和最外層函數(shù)定義的變量
var age = 20
function func1() {
  var sex = "男"
  function func2() {
    console.log("hello func2")
  }
  func2()
}
console.log(age)    //20
console.log(func1)  //正常執(zhí)行
console.log(func2)  //報(bào)錯
console.log(sex)    //報(bào)錯
2、所有未直接聲明的變量,直接賦值為全局變量
function func1() {
  var age = 20
  sex = "男"
}
func1()
console.log(sex)    //男
console.log(age)    //報(bào)錯
3、window對象上面的屬性具有全局作用域
function func1() {
  var age = 20
  sex = "男"
  console.log(top)   //window....
  
}
func1()
console.log(sex)   //"男"
console.log(top)   //window....

2、局部作用域

和全局作用域相反,局部作用域只在函數(shù)內(nèi)部可以訪問到。function func1() {  var age = 20  func1()  function func1() {    console.log("func1")  }}func1()和全局作用域相反,局部作用域只在函數(shù)內(nèi)部可以訪問到。
function func1() {
  var age = 20
  func1()

  function func1() {
    console.log("func1")
  }
}
func1()

二、javascript的作用域鏈

函數(shù)也是對象,在函數(shù)內(nèi)部存在一個屬性[[scope]],該屬性包含可以訪問屬性的集合。決定了哪些屬性在函數(shù)中可以訪問到。
下面我們以一個函數(shù)的例子來詳細(xì)解說一下,函數(shù)作用域鏈。
1、在函數(shù)函數(shù)創(chuàng)建出來時。代碼如下所示
function add(num1, num2) {
  return num1 + num2
}

在這里插入圖片描述

函數(shù)初始化時,會將自己的作用域鏈中放入全局變量
var total = add(10, 20)
這里是函數(shù)執(zhí)行時,當(dāng)執(zhí)行時會創(chuàng)建一個新的對象放入作用域鏈中,這個對象中包括
arguments, 形參,this,以及返回值。

在這里插入圖片描述

active object是活躍對象,是函數(shù)執(zhí)行時創(chuàng)建的對象,然后scope chain類似于棧結(jié)構(gòu),函數(shù)執(zhí)行前壓入棧中,函數(shù)執(zhí)行結(jié)束就從棧中彈出。函數(shù)訪問屬性的過程就是沿著scope chain從上往下一次查找。

三、作用域鏈和優(yōu)化

從上面的例子中,我們可以看出,訪問全局作用域是最慢的,因?yàn)樾枰来螐纳贤逻M(jìn)行查找,應(yīng)當(dāng)盡可能少的使用全局變量,應(yīng)該盡可能使用局部變量。如果在函數(shù)
中,使用多次全局變量,我們可以將全局變量轉(zhuǎn)化為局部變量,然后在使用局部變量。
function changeColor(){
    document.getElementById("btnChange").onclick=function(){
        document.getElementById("targetCanvas").style.backgroundColor="red";
    };
}
上面代碼我們使用了兩次document,但是document作為全局變量,此時我們應(yīng)該將其轉(zhuǎn)化為局部變量來使用,所以下面為轉(zhuǎn)化后的代碼。
function changeColor(){
    var doc=document;
    doc.getElementById("btnChange").onclick=function(){
        doc.getElementById("targetCanvas").style.backgroundColor="red";
    };
}

四、改變作用域鏈

1、with語法改變作用域鏈

with語法的作用就是為了解決代碼重寫問題,是對象快捷書寫方式,但是這么好的方式,為什么不大力推廣使用呢?因?yàn)樾阅艽嬖谝恍﹩栴}。function initUI(){    with(document){        var bd=body,            links=getElementsByTagName("a"),            i=0,            len=links.length;        while(i < len){            update(links[i++]);        }        getElementById("btnInit").onclick=function(){            doSomething();        };    }}這里使用with語法省略了document。with語法的作用就是為了解決代碼重寫問題,是對象快捷書寫方式,但是這么好的方式,為什么不大力推廣使用呢?
因?yàn)樾阅艽嬖谝恍﹩栴}。
function initUI(){
    with(document){
        var bd=body,
            links=getElementsByTagName("a"),
            i=0,
            len=links.length;
        while(i < len){
            update(links[i++]);
        }
        getElementById("btnInit").onclick=function(){
            doSomething();
        };
    }
}
這里使用with語法省略了document。

在這里插入圖片描述

with傳入的對象的屬性放入最上層,剩余的都往下壓,導(dǎo)致局部變量的訪問代價增大,所以with的性能不好。

2、catch語法

我們在使用try--catch時,當(dāng)代碼執(zhí)行錯誤時,會執(zhí)行catch函數(shù),catch函數(shù)中參數(shù)是錯誤對象,就是這個錯誤對象,會放到作用域鏈的頭部。
但是try--catch我們在必要的使用得使用,我們可以這樣解決。
try{
    doSomething();
}catch(ex){
    alert(ex.message); //作用域鏈在此處改變
}

處理后:
try{
    doSomething();
}catch(ex){
    handleError(ex); //委托給處理器方法
}
解決方案是:將catch錯誤處理交給另外一個函數(shù)進(jìn)行處理。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • js函數(shù)在frame中的相互調(diào)用詳解

    js函數(shù)在frame中的相互調(diào)用詳解

    一個HTML頁面可以有一個或多個子框架,這些子框架以<iframe>來標(biāo)記,用來顯示一個獨(dú)立的HTML頁面。這里所講的框架編程包括框架的自我控制以及框架之間的互相訪問,例如從一個框架中引用另一個框架中的JavaScript變量、調(diào)用其他框架內(nèi)的函數(shù)、控制另一個框架中表單的行為等
    2014-03-03
  • 淺談JavaScript Array對象

    淺談JavaScript Array對象

    這篇文章主要介紹了JavaScript Array對象的相關(guān)資料,需要的朋友可以參考下
    2014-12-12
  • js中對象深拷貝方法總結(jié)

    js中對象深拷貝方法總結(jié)

    js深拷貝這個問題,在實(shí)際的工作和面試當(dāng)中也是經(jīng)常使用到的。
    還經(jīng)常有一些公司要求,原生手寫實(shí)現(xiàn),這篇文章主要介紹了js中對象深拷貝方法總結(jié),需要的朋友可以參考下
    2022-10-10
  • JS中switch的四種寫法示例

    JS中switch的四種寫法示例

    這篇文章主要為大家介紹了JS中switch的四種寫法示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • js中常用的彈出對話框3種方式

    js中常用的彈出對話框3種方式

    javascript下自帶的三個彈出對話框效果,需要的朋友可以參考下。下面對各個函數(shù)的說明也有使用用途,
    2010-08-08
  • JavaScript中void(0)的具體含義解釋

    JavaScript中void(0)的具體含義解釋

    JavaScript中void(0)的具體含義解釋...
    2007-02-02
  • 淺談JavaScript的對象類型之function

    淺談JavaScript的對象類型之function

    這篇文章主要介紹了淺談JavaScript的對象類型之function,函數(shù)(方法)是由事件驅(qū)動的或者當(dāng)它被調(diào)用時執(zhí)行的可重復(fù)使用的代碼塊,需要的朋友可以參考下
    2023-05-05
  • 淺談Javascript中勻速運(yùn)動的停止條件

    淺談Javascript中勻速運(yùn)動的停止條件

    這篇文章主要給我們探討了Javascript中勻速運(yùn)動的停止條件的原理及其與緩沖運(yùn)動的區(qū)別,需要的朋友可以參考下
    2014-12-12
  • 每個程序員都需要學(xué)習(xí) JavaScript 的7個理由小結(jié)

    每個程序員都需要學(xué)習(xí) JavaScript 的7個理由小結(jié)

    這篇文章主要介紹了每個程序員都需要學(xué)習(xí) JavaScript 的7個理由小結(jié),需要的朋友可以參考下
    2016-09-09
  • 詳解在網(wǎng)頁上通過JS實(shí)現(xiàn)文本的語音朗讀

    詳解在網(wǎng)頁上通過JS實(shí)現(xiàn)文本的語音朗讀

    這篇文章主要介紹了在網(wǎng)頁上通過JS實(shí)現(xiàn)文本的語音朗讀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論

北流市| 乌审旗| 法库县| 安达市| 澎湖县| 沭阳县| 海淀区| 白水县| 沿河| 宝鸡市| 永丰县| 郸城县| 广水市| 南通市| 康乐县| 平度市| 镇雄县| 镶黄旗| 自贡市| 江陵县| 上栗县| 永寿县| 巩留县| 桃源县| 顺昌县| 江孜县| 保德县| 伊宁县| 宜良县| 新泰市| 资溪县| 潮安县| 体育| 四平市| 东阳市| 米易县| 项城市| 滁州市| 汾西县| 石嘴山市| 永吉县|