摘要:總結(jié)本博文通過介紹執(zhí)行上下文和作用域的異同的使用以及變量對象,讓我們加深對語言特性的理解。首先,我們介紹了執(zhí)行上下文和的的關(guān)系,并且執(zhí)行上下文是具有對象的然后,介紹了作用域使變量在作用域范圍內(nèi)可見,并且作用域是基于函數(shù)的。
接上一篇Javascript Context和Scope的學(xué)習(xí)總結(jié)01【轉(zhuǎn)自cnblogs的JKhuang】(可能是segmentfault對單篇文章發(fā)布字?jǐn)?shù)有限制,也沒有提示,繼續(xù)編輯chrome就會崩潰)
使用作用域解決上下文問題
接下來,繼續(xù)看一個例子,我們要在函數(shù)setTimeout()中調(diào)用方法onTimeout(),具體定義如下:
/** * setTimeout function with Broken Context issue * @type {Object} */ var o = { x:23, onTimeout: function(){ console.log("x:", this.x); }, m: function(){ setTimeout(function(){ this.onTimeout(); // ERROR: this.onTimeout is not a function }, 1); } } o.m();
同樣在函數(shù)setTimeout()中調(diào)用方法onTimeout()失敗,我們知道這是由于方法onTimeout()不能獲取對象執(zhí)行上下文。
我們知道在方法m()中可以獲取對象執(zhí)行上下文,所以可以通過臨時變量引用this指向的對象,實例代碼如下:
/** * Fixs setTimeout function with Broken Context issue. * @type {Object} */ var o = { x:23, onTimeout: function(){ console.log("x:", this.x); // outputs 23 }, m: function(){ // Keeps instance reference. var self = this; setTimeout(function(){ // Gets m scrope. self.onTimeout(); }, 1); } } o.m();
上面,我們通過臨時變量self保存了this的引用,由于setTimeout()函數(shù)可以獲取m()的作用域,所用我們可以通過self. onTimeout()的方式調(diào)用onTimeout()方法。
總結(jié)
本博文通過介紹執(zhí)行上下文和作用域的異同、this的使用以及變量對象,讓我們加深對Javascript 語言特性的理解。
首先,我們介紹了執(zhí)行上下文和this的的關(guān)系,并且執(zhí)行上下文是具有對象的;然后,介紹了作用域使變量在作用域范圍內(nèi)可見,并且作用域是基于函數(shù)的。
我們通過具體的例子介紹了在不同的作用域和執(zhí)行上下文中,對this和變量的影響加深了作用域和執(zhí)行上下文的理解,從而幫助我們更好的閱讀和編寫代碼。
參考
http://blog.goddyzhao.me/post...
http://clubajax.org/javascrip...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88097.html
摘要:正文執(zhí)行環(huán)境也稱為環(huán)境是中最為重要的一個概念。執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。簡而言之,執(zhí)行環(huán)境是基于對象的,而作用域是基于函數(shù)的。 前述 在我們學(xué)習(xí)Javascript過程中,常常會遇到作用域(Scope)和執(zhí)行上下文(Context)等概念。其中,執(zhí)行上下文與this關(guān)鍵字的關(guān)系密切。 有面向?qū)ο缶幊探?jīng)驗的各位,對于this關(guān)鍵字再熟悉不過了,因此...
摘要:發(fā)生這種情況的條件是當(dāng)引用類型值的對象恰好為活躍對象??偨Y(jié)本文介紹中的使用,更重要的是幫助我們能更好地理解值在全局函數(shù)構(gòu)造函數(shù)以及一些特例的情況中值的變化。然而,由于對于來說沒有任何意義,因此會隱式轉(zhuǎn)換為全局對象。 接上一篇Javascript this 的一些學(xué)習(xí)總結(jié)02【轉(zhuǎn)自cnblogs的JKhuang】 引用類型以及this的null值 對于前面提及的情形,還有例外的情況,當(dāng)調(diào)...
摘要:函數(shù)上下文中的值是函數(shù)調(diào)用者提供并且由當(dāng)前調(diào)用表達(dá)式的形式而定的。然而,由于對于來說沒有任何意義,因此會隱式轉(zhuǎn)換為全局對象。這里注意到四個表達(dá)式中,只有第一個表達(dá)式是指向?qū)ο蟮?,而其他三個表達(dá)式則執(zhí)行。 摘要 相信有C++、C#或Java等編程經(jīng)驗的各位,對于this關(guān)鍵字再熟悉不過了。由于Javascript是一種面向?qū)ο蟮木幊陶Z言,它和C++、C#或Java一樣都包含this關(guān)鍵字...
摘要:正式由于作用域鏈的這種關(guān)系,我們就不難理解,為什么和不能通過作用域鏈向上搜索,因為對和的搜索在當(dāng)前執(zhí)行函數(shù)的活動對象就停止了。 對于Javascript程序員來說,閉包總會讓你覺得既熟悉又陌生,然而它對于開發(fā)人員來說卻非常重要,javascript里的許多設(shè)計模式中都用到了閉包,此處以函數(shù)作用域為例。 //示例代碼 var a=1; function foo(){ ...
摘要:此時的作用域鏈包含了兩個對象的活動對象和對象。閉包的應(yīng)用場景保護(hù)函數(shù)內(nèi)的變量安全。依然如前例,由于閉包,函數(shù)中的一直存在于內(nèi)存中,因此每次執(zhí)行,都會給自加。 引子 JS的閉包一直是很多人不理解,也是在使用過程中經(jīng)常出現(xiàn)問題的地方。每次看文章都會有所了解閉包,但是,用起來還是不對,而且錯誤百出,其關(guān)鍵問題還是出在對其不理解,不了解。此文章會不定期更新以及完善,希望在我學(xué)習(xí)的時候,讓大家也...
閱讀 1533·2021-11-23 09:51
閱讀 3646·2021-09-26 09:46
閱讀 2135·2021-09-22 10:02
閱讀 1849·2019-08-30 15:56
閱讀 3333·2019-08-30 12:51
閱讀 2235·2019-08-30 11:12
閱讀 2069·2019-08-29 13:23
閱讀 2331·2019-08-29 13:16