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

首頁 > 語言 > JavaScript > 正文

JavaScript方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

2024-05-06 15:15:17
字體:
供稿:網(wǎng)友

在一個(gè)對象中綁定函數(shù),稱為這個(gè)對象的方法。

在JavaScript中,對象的定義是這樣的:

var xiaoming = { name: '小明', birth: 1990};

但是,如果我們給xiaoming綁定一個(gè)函數(shù),就可以做更多的事情。比如,寫個(gè)age()方法,返回xiaoming的年齡:

var xiaoming = { name: '小明', birth: 1990, age: function () {  var y = new Date().getFullYear();  return y - this.birth; }};xiaoming.age; // function xiaoming.age()xiaoming.age(); // 今年調(diào)用是25,明年調(diào)用就變成26了

綁定到對象上的函數(shù)稱為方法,和普通函數(shù)也沒啥區(qū)別,但是它在內(nèi)部使用了一個(gè)this關(guān)鍵字,這個(gè)東東是什么?

在一個(gè)方法內(nèi)部,this是一個(gè)特殊變量,它始終指向當(dāng)前對象,也就是xiaoming這個(gè)變量。所以, this.birth可以拿到xiaomingbirth屬性。

讓我們拆開寫:

function getAge() { var y = new Date().getFullYear(); return y - this.birth;}var xiaoming = { name: '小明', birth: 1990, age: getAge};xiaoming.age(); // 25, 正常結(jié)果getAge(); // NaN

單獨(dú)調(diào)用函數(shù)getAge()怎么返回了NaN?請注意,我們已經(jīng)進(jìn)入到了JavaScript的一個(gè)大坑里。

JavaScript的函數(shù)內(nèi)部如果調(diào)用了this,那么這個(gè)this到底指向誰?

答案是,視情況而定!

如果以對象的方法形式調(diào)用,比如xiaoming.age(),該函數(shù)的this指向被調(diào)用的對象,也就是xiaoming,這是符合我們預(yù)期的。

如果單獨(dú)調(diào)用函數(shù),比如getAge() ,此時(shí),該函數(shù)的this指向全局對象,也就是window

坑爹啊!

更坑爹的是,如果這么寫:

var fn = xiaoming.age; // 先拿到xiaoming的age函數(shù)fn(); // NaN

也是不行的!要保證this指向正確,必須用obj.xxx()的形式調(diào)用!

由于這是一個(gè)巨大的設(shè)計(jì)錯(cuò)誤,要想糾正可沒那么簡單。ECMA決定,在strict模式下讓函數(shù)的this指向undefined,因此,在strict模式下,你會(huì)得到一個(gè)錯(cuò)誤:

'use strict';var xiaoming = { name: '小明', birth: 1990, age: function () {  var y = new Date().getFullYear();  return y - this.birth; }};var fn = xiaoming.age;fn(); // Uncaught TypeError: Cannot read property 'birth' of undefined

這個(gè)決定只是讓錯(cuò)誤及時(shí)暴露出來,并沒有解決this應(yīng)該指向的正確位置。

有些時(shí)候,喜歡重構(gòu)的你把方法重構(gòu)了一下:

'use strict';var xiaoming = { name: '小明', birth: 1990, age: function () {  function getAgeFromBirth() {   var y = new Date().getFullYear();   return y - this.birth;  }  return getAgeFromBirth(); }};xiaoming.age(); // Uncaught TypeError: Cannot read property 'birth' of undefined            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 江都市| 威远县| 崇礼县| 胶南市| 湘乡市| 新田县| 名山县| 孝昌县| 朝阳区| 三门峡市| 宁城县| 桂东县| 青铜峡市| 丹江口市| 沁水县| 满洲里市| 凌云县| 峨眉山市| 隆昌县| 青龙| 临湘市| 普安县| 宣武区| 农安县| 泸水县| 慈溪市| 兴仁县| 南岸区| 离岛区| 隆化县| 柞水县| 盐池县| 吐鲁番市| 新河县| 新民市| 南阳市| 斗六市| 襄城县| 永定县| 益阳市| 弥勒县|