亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript函數調用與this解析

2019-11-08 18:34:51
字體:
來源:轉載
供稿:網友

js函數調用的四種方式

javascript主要有四種函數的調用方式,分別是方法調用、函數調用、構造器調用、Apply調用,不同之處在于this的初始化。對this關鍵字有解釋:一般而言,在Javascript中,this指向函數執行時的當前對象。 結合《JavaScript語言精粹》,下面用實例的方式對四種方式進行總結和解析。

一、方法調用模式

這種方式即為,一個函數被保存為一個對象的屬性,在此時此函數被成為一個方法。調用時this關鍵字被綁定到該對象,實例如下:

var myObject = { value: 0, increment: function (inc) { this.value += typeof inc === 'number' ? inc : 1; }};myObject.increment();console.log(myObject.value); // 1myObject.increment(2);console.log(myObject.value); // 3

在此例中,increment方法對myObject對象中的value屬性進行增加操作,increment函數中的this即指向myObject對象本身。

二、構造器調用模式

先來看這種調用模式的一個實例:

var Quo = function (string) { this.status = string;};Quo.PRototype.get_status = function () { return this.status;};var myQuo = new Quo("confused");console.log(myQuo.get_status()); // confused

輸出結果為confused,在使用構造函數構造新的對象時,構造函數的調用會創建一個新的對象,新對象會繼承構造函數的屬性和方法。在這里使用new來調用時,會創建一個連接到該函數的prototype成員的新對象,同時this會被綁定到這個新對象上。 即此時我們創建了myQuo對象,其連接到了Quo的prototype,且創建時的this.status = string;中的this指向這個創建的新對象,status為新對象myQuo的屬性,而不是Quo函數prototype的屬性,可以做如下驗證:

console.log(myQuo.hasOwnProperty("status")); //true

作為對比,我們對Quo函數增加一個屬性id:

var Quo = function (string) { this.status = string;};Quo.prototype.id = 1;

id為Quo構造器函數prototype對象的一個屬性,然后再次進行測試:

var myQuo = new Quo("confused");console.log(myQuo.id); //1console.log(myQuo.hasOwnProperty("get_status")); //falseconsole.log(myQuo.hasOwnProperty("id")); //false

這里可以看到在創建新對象myQuo時沒有id屬性和get_status函數,而這里myQuo繼承了Quo的id屬性,就通過原型鏈找到了Quo.prototype.id的值。

三、函數調用模式

先看一個最簡單的實例,在瀏覽器中:

function myFunction() { return this;}alert(myFunction()); // [object Window]

當函數沒有被自身的對象調用時, this 的值就會變成全局對象。在 web 瀏覽器中全局對象是瀏覽器窗口(window 對象)。該實例返回 this 的值即為window對象。也就是此函數即為window對象的函數,myFunction()等同于window.myFunction()。 但是此處在使用內部函數時存在一個this指向的問題,看下面的例子:

// 注意此處在node環境和瀏覽器環境下值不同,// node環境下必須去掉var使value成為全局變量。value = 4;var myObject = { value: 1, double: function () { //var that = this; var helper = function () { this.value = add(this.value, this.value); }; helper(); }};function add(a, b) { return a + b;}myObject.double();alert(value); // 8alert(myObject.value); // 1

在這里的myObject對象中,我們在double這個函數中使用了內部函數并賦值給helper,但是此處的this.value的this指向了全局對象,所以在執行這個函數后全局變量value的值變了但Object中的value屬性值仍然是1,這不是我們想要的結果。 《js語言精粹》中指出這里是語言設計上的一個錯誤,this應該仍然綁定到外部函數的this變量中。這個設計錯誤的后果就是方法不能利用內部函數來幫助它工作,因為內部函數的this被綁定了錯誤的值,所以不能共享該方法對對象的訪問權。 但是我們可以有一個很容易的解決方案去解決這個問題,對myObject進行修改:

var myObject = { value: 1, double: function () { var that = this; var helper = function () { that.value = add(that.value, that.value); }; helper(); }};myObject.double();alert(value); // 4alert(myObject.value); // 2

這里使用了一個that變量來指向double方法中this的值即myObject本身,這樣就可以對myObject對象的屬性value進行修改。

四、Apply調用模式

先來看一個簡單的例子:

// Apply and callvar array = [3, 4];function add(a, b) { return a + b;}var sum = add.apply(null, array);console.log(sum); // 7

這里主要介紹apply方法的使用,此方法可以讓我們構建一個參數數組傳遞給調用函數而且也允許我們選擇this的值,apply方法接受兩個參數,第一個是要綁定給this的值,第二個就是一個參數數組。和它相似的有方法call(),兩者的區別在于第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始):

// 兩者相同var array = [3, 4];var sum = add.apply(null, array);var sum = add.call(add, 3, 4);

另外一個結合Quo構造器調用模式使用的例子:

var statusObject = { status: 'A-OK'};var status = Quo.prototype.get_status.apply(statusObject);console.log(status); // A-OK

在這里即使用了apply并將statusObject作為get_status的this,結果即為A-OK。以上即為四種函數的調用方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲自拍| 久久久精品999| 中文欧美在线视频| 日本久久久久久久久| 国产区精品视频| 欧美在线一区二区三区四| 美女999久久久精品视频| 国产精品无av码在线观看| 国产欧美在线播放| 国产91精品久久久久久| 欧美夫妻性生活视频| 成人午夜激情免费视频| 5278欧美一区二区三区| 亚洲18私人小影院| 午夜精品久久久久久久久久久久| 久久久久久久久亚洲| 久久99久久99精品免观看粉嫩| 日韩欧美成人网| 亚洲成人网久久久| 日韩美女写真福利在线观看| 亚洲精品久久久一区二区三区| 欧美韩日一区二区| 欧美性猛交xxxx| 91在线观看免费高清完整版在线观看| 亚洲国产精品嫩草影院久久| www欧美日韩| 国产精品亚洲片夜色在线| 亚洲欧美日韩天堂一区二区| 最近更新的2019中文字幕| 精品久久久久久中文字幕一区奶水| 国产www精品| 亚洲自拍在线观看| 亚洲国产精久久久久久| 69久久夜色精品国产69乱青草| 97avcom| 欧美诱惑福利视频| 亚洲香蕉av在线一区二区三区| 欧美日韩免费在线观看| 亚洲国产欧美一区二区三区同亚洲| 日本一区二区三区四区视频| 亚洲乱码av中文一区二区| 亚洲一区二区三区xxx视频| 91精品国产91久久久久久不卡| 在线观看久久av| 国产亚洲欧美aaaa| 国语自产偷拍精品视频偷| 国产+成+人+亚洲欧洲| 亚洲国产精品久久91精品| 欧美亚洲第一页| 国产专区精品视频| 国产精品极品尤物在线观看| 日韩视频精品在线| 国产精品精品久久久| 欧美一级视频免费在线观看| 久久精品成人动漫| 亚洲精品一区在线观看香蕉| xvideos成人免费中文版| 亚洲成人1234| 欧美日韩美女在线观看| 久久精品国产成人精品| 亚洲理论在线a中文字幕| 欧美高清在线播放| 日韩精品丝袜在线| 欧美超级免费视 在线| 欧美激情xxxx性bbbb| 亚洲性av网站| 超碰91人人草人人干| 欧美黄色片免费观看| 国产精品久久久久久久久久小说| 亚洲欧美国产日韩天堂区| 欧美电影《睫毛膏》| 久久久精品2019中文字幕神马| 久久久久久久成人| 欧美黄网免费在线观看| 欧美精品18videos性欧美| 日韩在线视频导航| 成人久久18免费网站图片| 久久久久久久久网站| 国产精品极品尤物在线观看| 亚洲iv一区二区三区| 一区二区三区国产视频| 91精品中文在线| 国产精品视频不卡| 中文字幕一精品亚洲无线一区| 午夜免费在线观看精品视频| 日韩精品极品在线观看播放免费视频| 日韩电影网在线| 97精品一区二区视频在线观看| 97视频免费看| 久久久久久久久久久久久久久久久久av| 欧美日韩亚洲高清| 欧美日韩国产一中文字不卡| 亚洲视频电影图片偷拍一区| 国产精品午夜国产小视频| 亚洲第一福利网站| 激情av一区二区| 日产精品99久久久久久| 国产精品日韩电影| 成人免费网站在线看| 亚洲无线码在线一区观看| 成人性生交大片免费看视频直播| 亚洲a成v人在线观看| 日韩av在线免费看| 国产99视频在线观看| 久久久国产精品视频| 久久精品国产亚洲| 国产精品大陆在线观看| 欧美精品一区二区免费| 69国产精品成人在线播放| 亚洲性夜色噜噜噜7777| 亚洲精品一区av在线播放| 国产美女搞久久| 都市激情亚洲色图| 色噜噜亚洲精品中文字幕| 国产suv精品一区二区三区88区| 亚洲999一在线观看www| 亚洲欧美制服中文字幕| 亚洲视频在线观看网站| 日韩激情av在线免费观看| 欧美成人黑人xx视频免费观看| 日韩av在线播放资源| 亚洲美女黄色片| 国产成人精品一区| 992tv成人免费影院| 欧美精品免费在线| 日韩av网站在线| 成人写真福利网| 91av视频导航| 久久久久久久久久久亚洲| 欧美极品第一页| 精品国产欧美成人夜夜嗨| 国产亚洲福利一区| 成人有码在线视频| 亚洲国产免费av| 91av在线国产| 国产精品久久久久国产a级| 国产一区二区丝袜高跟鞋图片| 日韩欧美综合在线视频| 精品精品国产国产自在线| 日本一欧美一欧美一亚洲视频| 国产99久久精品一区二区 夜夜躁日日躁| 国产一区视频在线播放| 在线观看久久av| 狠狠躁18三区二区一区| 中文字幕av一区二区三区谷原希美| 亚洲成av人影院在线观看| 98精品国产自产在线观看| 日韩视频在线免费| 国产精品视频不卡| 亚洲成av人片在线观看香蕉| 欧美成人精品xxx| 亚洲视频日韩精品| 欧美激情在线一区| 亚洲专区在线视频| 亚洲国产精品va在线看黑人| 91精品久久久久久久久久久久久| 国产欧美欧洲在线观看| 久久综合亚洲社区| 日本久久久久久久久| 91免费在线视频网站| 7777精品久久久久久| 成人免费直播live| 中文字幕日韩精品在线| 国产精品自产拍在线观看中文|