摘要:由于匿名函數(shù)的作用域是全局性的,因此閉包的通常指向全局對(duì)象調(diào)用返回值為而不是我們預(yù)期的,在閉包中函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),要特別注意,該方法內(nèi)部匿名函數(shù)的指向的是全局變量。
有人的地方就有江湖,有函數(shù)的地方就有this。而this在不同的環(huán)境下,又表現(xiàn)為不同的形式,難免讓人有種此this非彼this的疑惑
在java等面向?qū)ο蟮恼Z言中,this指的就是當(dāng)前對(duì)象,而在javascript中這就不靈了,javascript中this是在編譯期動(dòng)態(tài)綁定的,這就形成了一把雙刃劍:足夠靈活卻又容易讓人迷惑。在javascript中this可以是全局對(duì)象、當(dāng)前對(duì)象甚至任意對(duì)象(obj.call(this))。
我們通過函數(shù)的幾種不同調(diào)用方式來看一下各自this的意義:
在javascript中函數(shù)也是個(gè)對(duì)象,因此,函數(shù)可以作為一個(gè)對(duì)象的屬性出現(xiàn):
var object = { name:"jeffie", sayWhat:function(){ console.log(this.name + ":hello"); //jeffie:hello } } object.sayWhat();
此處的this指向object對(duì)象,也就是函數(shù)所在的對(duì)象。
作為函數(shù)調(diào)用當(dāng)函數(shù)直接被調(diào)用時(shí),此時(shí)函數(shù)中的this指向全局變量,也就是window對(duì)象:
function obj(){ console.log(this); } obj();//Window構(gòu)造函數(shù)中的this
在作為構(gòu)造函數(shù)調(diào)用時(shí),this指向的是新生成的實(shí)例對(duì)象:
function Plugin(name,type){ this.name = name; this.type = type; } var plugin = new Plugin("core",1); console.log(plugin.name);//core使用apply或者call調(diào)用
javascript中每個(gè)函數(shù)都包含兩個(gè)方法:apply()和call(),這兩個(gè)方法非常強(qiáng)大,它們可以切換函數(shù)的上下文執(zhí)行環(huán)境,也就是說可以修改this綁定的對(duì)象。簡(jiǎn)單來說,這兩個(gè)方法可以用來設(shè)置函數(shù)的this,兩個(gè)方法都接收兩個(gè)參數(shù),第一個(gè)參數(shù)是運(yùn)行函數(shù)的作用域,第二個(gè)參數(shù)是參數(shù)對(duì)象,唯一的區(qū)別是apply第二個(gè)參數(shù)為參數(shù)數(shù)組(Array或者arguments):
function Plugin(name,type){ this.name = name; this.type = type; this.debugs = function(name,type){ console.log(this); //Object {name: "base", type: 3} } } var plugin1 = new Plugin("core",1); var plugin2 = {name:"base",type:3}; console.log(plugin1.debugs.call(plugin2));
通過上面的示例可以看出this值不再指向Plugin對(duì)象了,而是指向了plugin2的對(duì)象。
閉包中使用this通常我們理解this對(duì)象是運(yùn)行時(shí)基于函數(shù)綁定的,全局函數(shù)中this對(duì)象就是window對(duì)象,而當(dāng)函數(shù)作為對(duì)象中的一個(gè)方法調(diào)用時(shí),this等于這個(gè)對(duì)象。由于匿名函數(shù)的作用域是全局性的,因此閉包的this通常指向全局對(duì)象window:
var scope = "global"; var object = { scope:"local", getScope:function(){ return function(){ return this.scope; } } }
調(diào)用object.getScope()()返回值為global而不是我們預(yù)期的local,在閉包中函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),要特別注意,該方法內(nèi)部匿名函數(shù)的this指向的是全局變量。參考上一篇閉包
這屬于 JavaScript 的設(shè)計(jì)缺陷,正確的設(shè)計(jì)方式是內(nèi)部函數(shù)的 this 應(yīng)該綁定到其外層函數(shù)對(duì)應(yīng)的對(duì)象上,為了規(guī)避這一設(shè)計(jì)缺陷,聰明的 JavaScript 程序員想出了變量替代的方法,只需要把外部函數(shù)作用域的this存放到一個(gè)閉包能訪問的變量里面即可,約定俗成,該變量一般被命名為 that:
var scope = "global"; var object = { scope:"local", getScope:function(){ var that = this; return function(){ return that.scope; } } } object.getScope()()返回值為local。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87605.html
摘要:下面是用實(shí)現(xiàn)轉(zhuǎn)成抽象語法樹如下還支持繼承以下是轉(zhuǎn)換結(jié)果最終的結(jié)果還是代碼,其中包含庫(kù)中的一些函數(shù)。可以使用新的易于使用的類定義,但是它仍然會(huì)創(chuàng)建構(gòu)造函數(shù)和分配原型。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 15 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過了前面的章節(jié),可以在這里找到它們: JavaScript 是...
摘要:到底是什么函數(shù)被調(diào)用時(shí)的位置是動(dòng)態(tài)的箭頭函數(shù)不在此范圍,因?yàn)樗氖呛瘮?shù)定義時(shí)的上下文,是靜態(tài)的判斷規(guī)則如果是在中調(diào)用,則為新創(chuàng)建的對(duì)象通過,調(diào)用,是之前定的對(duì)象第一個(gè)參數(shù)注意若第一個(gè)參數(shù)是,則執(zhí)行第四條判斷規(guī)則在么某個(gè)上下文中調(diào)用,是該上下 this到底是什么? 函數(shù)被調(diào)用時(shí)的位置(是動(dòng)態(tài)的!)(箭頭函數(shù)不在此范圍,因?yàn)樗膖his是函數(shù)定義時(shí)的上下文,是靜態(tài)的!) 判斷規(guī)則 1.如果...
摘要:插件開發(fā)前端掘金作者原文地址譯者插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內(nèi)優(yōu)雅的實(shí)現(xiàn)文件分片斷點(diǎn)續(xù)傳。 Vue.js 插件開發(fā) - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應(yīng)用添加全局功能的一種強(qiáng)大而且簡(jiǎn)單的方式。插....
普通函數(shù)的this指向 簡(jiǎn)單說說 首先,按照慣例,我們先舉個(gè)栗子: var bar = 2; function foo() { this.bar = 1; this.getBar = function() { console.log(this.bar); } } var test = new foo(); var getBar = test.getBar; test.getB...
摘要:將對(duì)象的屬性拷貝到了對(duì)象,合并成一個(gè)新的對(duì)象。而這種行為也是新增的標(biāo)準(zhǔn)。總結(jié)本章講解了對(duì)象字面量語法拓展,新增方法,允許重復(fù)的對(duì)象字面量屬性,自有枚舉屬性排序,增強(qiáng)對(duì)象原型,明確了方法的定義。但是,就算把全部新增的功能記住也不是難事。 變量功能被加強(qiáng)了、函數(shù)功能被加強(qiáng)了,那么作為JavaScript中最普遍的對(duì)象,不加強(qiáng)對(duì)得起觀眾嗎? 對(duì)象類別 在ES6中,對(duì)象分為下面幾種叫法。(不需...
閱讀 1527·2021-11-18 10:02
閱讀 1671·2021-09-04 16:40
閱讀 3178·2021-09-01 10:48
閱讀 878·2019-08-30 15:55
閱讀 1857·2019-08-30 15:55
閱讀 1377·2019-08-30 13:05
閱讀 3020·2019-08-30 12:52
閱讀 1630·2019-08-30 11:24