国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript this詳細介紹

2019-11-20 08:56:54
字體:
來源:轉載
供稿:網友

this的值是在運行時確定的

JS中的this究竟代表什么,這是在程序運行時根據上下文環境確定,可以分為以下幾種情況。

1. 全局作用域中的this

在全局作用域中,this指向window對象。

console.log(this);//指向window對象this.x = 5//在全局作用域內創建一個x//與this.x = 5的等價情況://var x = 5;//x = 5;

在全局作用域中執行var x=5,其實是為window對象創建一個屬性x,并令其等于5。

若定義變量時不加var,JS會認為該變量為全局變量,會將其當作window對象的屬性。

2. 函數中的this

JS中函數有兩種,直接調用的函數稱為普通函數,通過new創建對象的函數稱為構造函數。

2.1 構造函數中的this

構造函數的this指向它所創建的對象,如:

function Person(name){  this.name = name;//this指向該函數創建的對象person}var person = new Person("chaimm");

2.2 普通函數中的this

普通函數的this指向window對象。
若上述例子,直接執行Perosn函數,則其中this代表window對象,因此該函數執行后會創建一個全局的name。

function Person(name){  this.name = name;//this指向window}Person("chai");//當作普通函數執行,this指向window對象

3. 對象中的this

對象中的this指向當前對象,如:

var person = {  name : "chaimm",  getName : function(){    return this.name;  }}

上述代碼中this指向函數getName所屬的對象。

但是,如果一個對象的函數中又嵌套了一個函數,這個函數的this指向的卻是window,而并不是其外層的對象。

var person = {  name : "chaimm",  setName : function(name){    (function(name){      this.name = name; //此時this并不代表person對象,而是代表window對象    })(name);  }}

上述示例中,person對象中有一個getName函數,而getName函數內部又有一個函數,這個函數內部的this指向window對象,而非person對象,這是JS的一個bug!一般作如下處理,規避這個bug:

var person = {  name : "chaimm",  setName : function(name){    var thar = this;//將this賦給that    (function(name){      that.name = name;//此時that指向person對象    })(name);  }}

我們在person對象的第一層函數中,將this賦給局部變量that,然后在第二層函數中使用that,此時that指向person對象,可對person的屬性進行操作。

注意:若將一個對象中的函數賦給一個變量后,再通過該變量調用這個函數,此時該函數中的this指向window,而非該對象,如下所示:

var person = {  name : "chaimm",  getName : function(){    return this.name;  }}//將getName函數賦給一個新的變量var newGetName = person.getName;//通過新的變量調用這個函數,這個函數中的this將指向windownewGetName();//若全局作用域中沒有name,則將返回undefined

4. 用call和apply函數給this開掛

這兩個函數都能手動指定被調用函數內部的this指向哪個對象。

//定義一個構造函數var Person = function(name){  this.name = "";  this.setName = function(name){    this.name = name;  }}//創建兩個對象var personA = new Person("A");var personB = new Person("B");//使用personA的setName函數去修改personB的name屬性personA.setName.apply(personB,["C"]);

apply用法

對象A.函數名.apply(對象B, 參數列表);
當對象B作為apply的第一個參數傳給apply時,對象A的函數中this就指向了對象B,此時對象A的該函數對this的操作將會作用在對象B上,由此實現了用對象A去調用對象B的函數。

以上就是對javascript this的資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博爱县| 北安市| 化州市| 清河县| 池州市| 古蔺县| 靖安县| 奈曼旗| 磴口县| 礼泉县| 天峨县| 阳信县| 河东区| 都兰县| 章丘市| 镇安县| 连城县| 永胜县| 弋阳县| 织金县| 玛多县| 咸阳市| 乳源| 农安县| 临清市| 营口市| 隆尧县| 青川县| 凉城县| 新乡市| 盐城市| 屏边| 治县。| 牡丹江市| 仁布县| 香港| 土默特右旗| 阿城市| 泰兴市| 昔阳县| 昌宁县|