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

JavaScript 嵌套函數指向this對象錯誤的解決方法

 更新時間:2010年03月15日 11:16:32   作者:  
JavaScript對于全局函數內的this綁定為全局對象,而對于嵌套函數也采用了相同的解釋。
先看一段嵌套了兩層function的JavaScript代碼:
復制代碼 代碼如下:

var me = {
name : 'Jimbor',
blog : 'http://jmedia.cn/',
sayMyName : function(){
var pre = 'My name is: ';
function displayName(){
alert(pre + this.name);
}
displayName();
}
}
me.sayMyName();

從代碼上看,我們希望通過sayMyName()的調用來顯示me的name屬性,即:My name is: Jimbor。但瀏覽器的執(zhí)行結果是:
復制代碼 代碼如下:

My name is:

是什么原因使name屬性沒有正確顯示呢?原來JavaScript對于全局函數內的this綁定為全局對象,而對于嵌套函數也采用了相同的解釋。這個錯誤產生的后果是不能輕易使用嵌套函數來完成某些特殊的任務,因為這些函數對this所指向的對象解釋不同。
當然對于這個例子,我們完全可以不用嵌套的函數來完成相應的功能。但是對于某些應用可能會需要這種結構。幸運的是,我們還是有辦法來糾正這個錯誤的。
方法一:用apply()函數
復制代碼 代碼如下:

apply(this_obj, params_array)

apply()函數可以在調用某個函數時重寫this所指向的對象,它接受兩個參數,第一個this_obj即想要重寫this所指向的對象,params_array則是用來傳遞給調用函數的參數數組。我們把原來的代碼改寫為:
復制代碼 代碼如下:

var me = {
name : 'Jimbor',
blog : 'http://jmedia.cn/',
sayMyName : function(){
var pre = 'My name is: ';
function displayName(){
alert(pre + this.name);
}
displayName.apply(me);
}
}
me.sayMyName();

再看瀏覽器執(zhí)行結果:
My name is: Jimbor
類似的函數還有call()。區(qū)別是call()傳參的方式是一個接一個而不是打包成一個數組。
方法二:用that替換this
即我們可以在最外層的函數定義一個變量來指向this所指向的對象,一旦內部的函數需要調用this時,我們就用這個定義的變量。通常根據習慣,會將這個變量命名為that。那么原來的代碼可以改成這樣:
復制代碼 代碼如下:

var me = {
name : 'Jimbor',
blog : 'http://jmedia.cn/',
sayMyName : function(){
var pre = 'My name is: ';
var that = this;
function displayName(){
alert(pre + that.name);
}
displayName();
}
}
me.sayMyName();

很好用,不是嗎?因為不會涉及到具體的對象指定,所以更推薦第二種方法。

相關文章

  • toString.call()通用的判斷數據類型方法示例

    toString.call()通用的判斷數據類型方法示例

    這篇文章主要給大家介紹了關于toString.call()通用的判斷數據類型方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • xmlplus組件設計系列之分隔框(DividedBox)(8)

    xmlplus組件設計系列之分隔框(DividedBox)(8)

    xmlplus 是一個JavaScript框架,用于快速開發(fā)前后端項目。這篇文章主要介紹了xmlplus布局類組件之分隔框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • js精度溢出解決方案

    js精度溢出解決方案

    一般參數值不能超過16位。如果超出16都是用0替代,導致我們查詢不到自己想要的結果,本文將介紹如何處理這種現象
    2012-12-12
  • 如何使用瀏覽器擴展篡改網頁中的JS?文件

    如何使用瀏覽器擴展篡改網頁中的JS?文件

    這篇文章主要為大家介紹了如何使用瀏覽器擴展篡改網頁中的JS文件實現解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • js遍歷詳解(forEach, map, for, for...in, for...of)

    js遍歷詳解(forEach, map, for, for...in, for...of)

    在本篇文章里小編給大家整理的是關于js中的各種遍歷(forEach, map, for, for...in, for...of)相關知識點用法總結,需要的朋友們參考下。
    2019-08-08
  • 異步安全加載javascript文件的方法

    異步安全加載javascript文件的方法

    這篇文章主要介紹了異步安全加載javascript文件的方法,實例分析了javascript實現文件異步加載的具體技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 前端設計師們最常用的JS代碼匯總

    前端設計師們最常用的JS代碼匯總

    本文給大家整理匯總了一些做前端經常需要用的到JavaScript代碼片段,非常的全面,有需要的小伙伴可以參考下
    2016-09-09
  • JS實現仿QQ面板的手風琴效果折疊菜單代碼

    JS實現仿QQ面板的手風琴效果折疊菜單代碼

    這篇文章主要介紹了JS實現仿QQ面板的手風琴效果折疊菜單代碼,涉及JavaScript基于鼠標事件動態(tài)操作頁面元素樣式的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 微信小程序獲取用戶手機號碼的詳細步驟

    微信小程序獲取用戶手機號碼的詳細步驟

    最近改了一個公司項目,新增加了一個獲取用戶手機號功能,里面用到了關于獲取用戶信息和用戶手機號的功能,下面這篇文章主要給大家介紹了關于微信小程序獲取用戶手機號碼的相關資料,需要的朋友可以參考下
    2022-07-07
  • 學習JS中的DOM節(jié)點以及操作

    學習JS中的DOM節(jié)點以及操作

    本篇文章給大家整理了關于JS中DOM節(jié)點的相關知識點以及代碼實例,有興趣的朋友可以跟著學習下。
    2018-04-04

最新評論

石渠县| 宜川县| 镇宁| 井陉县| 禹州市| 岚皋县| 昌平区| 昌黎县| 彭阳县| 汤原县| 大余县| 天津市| 赣州市| 玉屏| 林周县| 西林县| 五华县| 兴和县| 顺平县| 建水县| 鞍山市| 庆元县| 永年县| 德惠市| 沧源| 东海县| 黔东| 长顺县| 白山市| 竹溪县| 辉县市| 宁陵县| 云南省| 无锡市| 建德市| 枝江市| 宁陵县| 金湖县| 大姚县| 林甸县| 临沂市|