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

JavaScript中的this關(guān)鍵字使用方法總結(jié)

 更新時(shí)間:2015年03月13日 11:04:39   投稿:junjie  
這篇文章主要介紹了JavaScript中的this關(guān)鍵字使用方法總結(jié),本文講解了作為對(duì)象方法調(diào)用、作為函數(shù)調(diào)用、作為構(gòu)造函數(shù)調(diào)用、使用 apply 或 call 調(diào)用等內(nèi)容,需要的朋友可以參考下

在javascritp中,不一定只有對(duì)象方法的上下文中才有this, 全局函數(shù)調(diào)用和其他的幾種不同的上下文中也有this指代。
它可以是全局對(duì)象、當(dāng)前對(duì)象或者任意對(duì)象,這完全取決于函數(shù)的調(diào)用方式。JavaScript 中函數(shù)的調(diào)用有以下幾種方式:作為對(duì)象方法調(diào)用,作為函數(shù)調(diào)用,作為構(gòu)造函數(shù)調(diào)用,和使用 apply 或 call 調(diào)用。

1.作為對(duì)象方法調(diào)用

在 JavaScript 中,函數(shù)也是對(duì)象,因此函數(shù)可以作為一個(gè)對(duì)象的屬性,此時(shí)該函數(shù)被稱為該對(duì)象的方法,在使用這種調(diào)用方式時(shí),this 被自然綁定到該對(duì)象。

復(fù)制代碼 代碼如下:
 
var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
    this.x = this.x + x;
    this.y = this.y + y;
    }
};
point.moveTo(1, 1)//this 綁定到當(dāng)前對(duì)象,即 point 對(duì)象

2.作為函數(shù)調(diào)用

函數(shù)也可以直接被調(diào)用,此時(shí) this 綁定到全局對(duì)象。在瀏覽器中,window 就是該全局對(duì)象。比如下面的例子:函數(shù)被調(diào)用時(shí),this 被綁定到全局對(duì)象,接下來(lái)執(zhí)行賦值語(yǔ)句,相當(dāng)于隱式的聲明了一個(gè)全局變量,這顯然不是調(diào)用者希望的。

復(fù)制代碼 代碼如下:
 
function makeNoSense(x) {
this.x = x;
}
makeNoSense(5);
x;// x 已經(jīng)成為一個(gè)值為 5 的全局變量

對(duì)于內(nèi)部函數(shù),即聲明在另外一個(gè)函數(shù)體內(nèi)的函數(shù),這種綁定到全局對(duì)象的方式會(huì)產(chǎn)生另外一個(gè)問(wèn)題。我們?nèi)匀灰郧懊嫣岬降?point 對(duì)象為例,這次我們希望在 moveTo 方法內(nèi)定義兩個(gè)函數(shù),分別將 x,y 坐標(biāo)進(jìn)行平移。結(jié)果可能出乎大家意料,不僅 point 對(duì)象沒(méi)有移動(dòng),反而多出兩個(gè)全局變量 x,y。

復(fù)制代碼 代碼如下:

var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
    // 內(nèi)部函數(shù)
    var moveX = function(x) {
    this.x = x;//this 綁定到了哪里?
   };
   // 內(nèi)部函數(shù)
   var moveY = function(y) {
   this.y = y;//this 綁定到了哪里?
   };

   moveX(x);
   moveY(y);
   }
};
point.moveTo(1, 1);
point.x; //==>0
point.y; //==>0
x; //==>1
y; //==>1

這屬于 JavaScript 的設(shè)計(jì)缺陷,正確的設(shè)計(jì)方式是內(nèi)部函數(shù)的 this 應(yīng)該綁定到其外層函數(shù)對(duì)應(yīng)的對(duì)象上,為了規(guī)避這一設(shè)計(jì)缺陷,聰明的 JavaScript 程序員想出了變量替代的方法,約定俗成,該變量一般被命名為 that。

復(fù)制代碼 代碼如下:

var point = {
 x : 0,
 y : 0,
 moveTo : function(x, y) {
      var that = this;
     // 內(nèi)部函數(shù)
     var moveX = function(x) {
     that.x = x;
     };
     // 內(nèi)部函數(shù)
     var moveY = function(y) {
     that.y = y;
     }
     moveX(x);
     moveY(y);
     }
 };
 point.moveTo(1, 1);
 point.x; //==>1
 point.y; //==>1

作為構(gòu)造函數(shù)調(diào)用

JavaScript 支持面向?qū)ο笫骄幊?,與主流的面向?qū)ο笫骄幊陶Z(yǔ)言不同,JavaScript 并沒(méi)有類(class)的概念,而是使用基于原型(prototype)的繼承方式。相應(yīng)的,JavaScript 中的構(gòu)造函數(shù)也很特殊,如果不使用 new 調(diào)用,則和普通函數(shù)一樣。作為又一項(xiàng)約定俗成的準(zhǔn)則,構(gòu)造函數(shù)以大寫(xiě)字母開(kāi)頭,提醒調(diào)用者使用正確的方式調(diào)用。如果調(diào)用正確,this 綁定到新創(chuàng)建的對(duì)象上。

復(fù)制代碼 代碼如下:

function Point(x, y){
   this.x = x;
   this.y = y;
}

使用 apply 或 call 調(diào)用

讓我們?cè)僖淮沃厣?,?JavaScript 中函數(shù)也是對(duì)象,對(duì)象則有方法,apply 和 call 就是函數(shù)對(duì)象的方法。這兩個(gè)方法異常強(qiáng)大,他們?cè)试S切換函數(shù)執(zhí)行的上下文環(huán)境(context),即 this 綁定的對(duì)象。很多 JavaScript 中的技巧以及類庫(kù)都用到了該方法。讓我們看一個(gè)具體的例子:

復(fù)制代碼 代碼如下:

function Point(x, y){
   this.x = x;
   this.y = y;
   this.moveTo = function(x, y){
       this.x = x;
       this.y = y;
   }
}

var p1 = new Point(0, 0);
var p2 = {x: 0, y: 0};
p1.moveTo(1, 1);
p1.moveTo.apply(p2, [10, 10]);

在上面的例子中,我們使用構(gòu)造函數(shù)生成了一個(gè)對(duì)象 p1,該對(duì)象同時(shí)具有 moveTo 方法;使用對(duì)象字面量創(chuàng)建了另一個(gè)對(duì)象 p2,我們看到使用 apply 可以將 p1 的方法應(yīng)用到 p2 上,這時(shí)候 this 也被綁定到對(duì)象 p2 上。另一個(gè)方法 call 也具備同樣功能,不同的是最后的參數(shù)不是作為一個(gè)數(shù)組統(tǒng)一傳入,而是分開(kāi)傳入的。

復(fù)制代碼 代碼如下:

function Foo(){
//1.this引用的構(gòu)造函數(shù)是argument.callee引用的對(duì)象
//說(shuō)明是通過(guò)new操作符執(zhí)行的構(gòu)造函數(shù)
if(this.constructor==arguments.callee){
alert('Object Created');
}
//2.this是window, 那么是全局調(diào)用
if(this==window){
alert('normal call');
}
else{//3.否則是作為其他對(duì)象的方法來(lái)調(diào)用
alert('called by '+ this.constructor);
}
}
Foo();//全局函數(shù)調(diào)用
Foo.call(new Object());//作為一個(gè)object對(duì)象的成員方法來(lái)調(diào)用
new Foo();//被new操作符調(diào)用,執(zhí)行對(duì)象構(gòu)造

相關(guān)文章

  • js鼠標(biāo)懸浮出現(xiàn)遮罩層的方法

    js鼠標(biāo)懸浮出現(xiàn)遮罩層的方法

    這篇文章主要介紹了js鼠標(biāo)懸浮出現(xiàn)遮罩層的方法,以實(shí)例形式較為詳細(xì)的分析了html及css頁(yè)面布局與js特效的實(shí)現(xiàn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2015-01-01
  • bootstrap導(dǎo)航欄、下拉菜單、表單的簡(jiǎn)單應(yīng)用實(shí)例解析

    bootstrap導(dǎo)航欄、下拉菜單、表單的簡(jiǎn)單應(yīng)用實(shí)例解析

    這篇文章主要介紹了bootstrap導(dǎo)航欄、下拉菜單、表單的簡(jiǎn)單應(yīng)用實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-01-01
  • JavaScript實(shí)現(xiàn)限時(shí)秒殺功能

    JavaScript實(shí)現(xiàn)限時(shí)秒殺功能

    各種電商活動(dòng)都喜換選擇限時(shí)秒殺活動(dòng)形式,這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)限時(shí)秒殺功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Js實(shí)現(xiàn)雙擊鼠標(biāo)自動(dòng)滾動(dòng)屏幕的示例代碼

    Js實(shí)現(xiàn)雙擊鼠標(biāo)自動(dòng)滾動(dòng)屏幕的示例代碼

    這篇文章主要介紹了Js實(shí)現(xiàn)雙擊鼠標(biāo)自動(dòng)滾動(dòng)屏幕的示例代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • JavaScript引入方式深入解讀

    JavaScript引入方式深入解讀

    這篇文章主要介紹了JavaScript引入方式案例,結(jié)合實(shí)例形式分析了JavaScript引入方式特性與相關(guān)操作技巧,需要的朋友可以參考下
    2022-07-07
  • 詳解Webpack-dev-server的proxy用法

    詳解Webpack-dev-server的proxy用法

    這篇文章主要介紹了詳解Webpack-dev-server的proxy用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 最新評(píng)論

    永泰县| 天峻县| 普陀区| 金川县| 银川市| 汶川县| 鹤峰县| 颍上县| 洪泽县| 城步| 灵台县| 英德市| 利津县| 柘荣县| 盐池县| 长沙市| 乌审旗| 昆明市| 渝北区| 舞钢市| 环江| 东阿县| 拉萨市| 如皋市| 龙川县| 河北区| 建宁县| 镇远县| 颍上县| 怀化市| 甘泉县| 原平市| 南召县| 凤庆县| 永年县| 安庆市| 呈贡县| 镇安县| 崇明县| 淮安市| 宁都县|