摘要:其次,指向有一個(gè)好處,構(gòu)造函數(shù)一般不要直接運(yùn)行,那要是強(qiáng)行運(yùn)行呢指向會(huì)給添加許多屬性,有擾亂命名空間之嫌,指向之后,你強(qiáng)行運(yùn)行我就強(qiáng)行報(bào)錯(cuò)會(huì)給增加屬性,改成嚴(yán)格模式就會(huì)當(dāng)然,不能解決所有問(wèn)題,所以有了箭頭函數(shù)參考嚴(yán)格模式詳解
上github看原文:點(diǎn)一下
系列一日,見(jiàn)“use strict”,冥想許久……
系列列表:
從use strict看JS(一):this與箭頭函數(shù)
從use strict看JS(二):函數(shù)傳參模式與arguments
use strict指js的嚴(yán)格模式,還沒(méi)了解的看這里:Javascript 嚴(yán)格模式詳解
use strict有3點(diǎn)比較重要
函數(shù)調(diào)用this為undefined
arguments。不允許對(duì)arguments賦值。禁止使用arguments.callee。arguments不再追蹤參數(shù)的變化
不用var聲明不會(huì)提升成全局變量,而是報(bào)錯(cuò)
use strict還有一些常人不易寫(xiě)錯(cuò)的,不納入寫(xiě)作范圍:
對(duì)象不能有重名的屬性,函數(shù)不能有重名的參數(shù)
規(guī)定保留字。class, implements
回歸正題,什么是函數(shù)調(diào)用?為何嚴(yán)格模式函數(shù)調(diào)用要將this指向undefined?
this調(diào)用的四種模式首先牢記:js function有四種方式調(diào)用,每一種的this都不同。
方法調(diào)用當(dāng)函數(shù)被保存為對(duì)象的屬性時(shí),我們稱(chēng)這個(gè)函數(shù)為方法。方法調(diào)用的this就綁定到該對(duì)象
var dog={ name:"doge", sayName:function(){ console.log(this.name); } } //輸出doge,this綁定到了dog dog.sayName();函數(shù)調(diào)用
聲明一個(gè)function然后調(diào)用。非嚴(yán)格模式this指向window,嚴(yán)格模式是undefined
function sayName(){ console.log(this); } function sayNameStrict(){ "use strict"; console.log(this); } //指向window sayName(); //開(kāi)啟嚴(yán)格模式,指向undefined sayNameStrict();構(gòu)造函數(shù)調(diào)用
這在對(duì)象、對(duì)象繼承用的比較多,通過(guò)new來(lái)使用,this指向new出來(lái)的新對(duì)象。
后面會(huì)有文章講解new如何實(shí)現(xiàn),到時(shí)候就會(huì)很清楚。
function Dog(name){ this.name=name; } var dog=new Dog("doge"); //this指向dog console.log(dog.name);apply & call & bind
這類(lèi)就是改變this,apply和call是很重要的,所以許多面試都會(huì)問(wèn),之后的文章我們會(huì)看到它們的強(qiáng)大作用。
問(wèn)題:當(dāng)對(duì)象的方法返回了函數(shù)?那就是函數(shù)調(diào)用了。這是js的一個(gè)設(shè)計(jì)錯(cuò)誤,this應(yīng)該綁定到外部函數(shù)的this變量,
這個(gè)錯(cuò)誤即是“函數(shù)調(diào)用”this綁定的錯(cuò)誤。嚴(yán)格模式規(guī)定,this不指向window了,但并沒(méi)有解決這個(gè)問(wèn)題,于是箭頭函數(shù)來(lái)了。
var dog={ name:"doge", sayName:function(){ return function(){ console.log(this); } } } // 此時(shí)是函數(shù)調(diào)用,this指向window dog.sayName()();箭頭函數(shù)對(duì)this的改變
箭頭函數(shù)怎么解決這個(gè)問(wèn)題呢?其實(shí)用了閉包,改成下面這樣,babel啥的也是這樣做的。
var dog = { name: "doge", sayName: function sayName() { var _this = this; return function () { console.log(_this); }; } };
那如果嵌套了多層箭頭函數(shù)?對(duì)閉包來(lái)說(shuō)是一樣的
var dog={ name:"doge", sayName:function(){ return ()=>{ return ()=>{ console.log(this); } } } }
相當(dāng)于
var dog = { name: "doge", sayName: function sayName() { var _this = this; return function () { return function () { console.log(_this); }; }; } };
那如果函數(shù)的屬性就是箭頭函數(shù)?沒(méi)有這樣用的!你會(huì)拿到window
var dog={ name:"doge", sayName:()=>{ console.log(this); } } // this指向window,因?yàn)榧^函數(shù) dog.sayName();the good parts
這是一本書(shū),文末有鏈接。
the good parts說(shuō)過(guò):js語(yǔ)言有些地方設(shè)計(jì)得不好,于是后來(lái)的標(biāo)準(zhǔn)不斷地補(bǔ)坑。
the good parts又說(shuō)過(guò):js 函數(shù)調(diào)用this綁定到window是一個(gè)設(shè)計(jì)錯(cuò)誤
等等,嚴(yán)格模式函數(shù)調(diào)用this為何指向undefined??
首先,不該指向window,所以換一個(gè)。
其次,指向undefined有一個(gè)好處,構(gòu)造函數(shù)一般不要直接運(yùn)行,那要是強(qiáng)行運(yùn)行呢?this指向window會(huì)給window添加許多屬性,有擾亂命名空間之嫌,指向undefined之后,你強(qiáng)行運(yùn)行我就強(qiáng)行報(bào)錯(cuò)!
function Dog(name){
this.name=name;
}
//會(huì)給window增加name屬性,改成嚴(yán)格模式就會(huì)TypeError
Dog("doge");
當(dāng)然,use strict不能解決所有問(wèn)題,所以有了箭頭函數(shù)
參考Javascript 嚴(yán)格模式詳解
the good parts
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82336.html
摘要:聲明了一個(gè)函數(shù),并且將它作為一個(gè)構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用是函數(shù)的構(gòu)造函數(shù)調(diào)用。構(gòu)造函數(shù)中的在構(gòu)造函數(shù)調(diào)用中指向新創(chuàng)建的對(duì)象構(gòu)造函數(shù)調(diào)用的上下文是新創(chuàng)建的對(duì)象。來(lái)看看下面示例中的上下文正在進(jìn)行構(gòu)造函數(shù)調(diào)用,其中上下文是。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 1. this 的奧秘 很多時(shí)候, JS 中...
摘要:箭頭函數(shù)沒(méi)有綁定,意味著箭頭函數(shù)內(nèi)部的值只能通過(guò)查找作用域鏈來(lái)確定。無(wú)論此后箭頭函數(shù)在何處執(zhí)行,該對(duì)象都是可用的。 箭頭函數(shù) es6的箭頭函數(shù),顧名思義箭頭函數(shù)是使用一個(gè)箭頭( => )來(lái)定義的函數(shù),這很容易理解但是它有很多行為與傳統(tǒng)的js函數(shù)不同: 沒(méi)有 this 、 super 、 arguments 。 不能被使用 new 調(diào)用: 箭頭函數(shù)沒(méi)有 [[Construct]] 方法...
摘要:系列系列列表從看一與箭頭函數(shù)從看二函數(shù)傳參模式與的上一篇說(shuō)到,對(duì)做了以下限定。是另外一個(gè)變量,指向不同的值,而這兩個(gè)值有相同的類(lèi)型。函數(shù)中,和指向同一個(gè)值,更改的就等于更改了的。可以用改進(jìn)問(wèn)題是這個(gè)在嚴(yán)格模式下不能運(yùn)行。 系列 系列列表:從use strict看JS(一):this與箭頭函數(shù)從use strict看JS(二):函數(shù)傳參模式與arguments use strict 的 ...
摘要:的幾種用法關(guān)于是什么理論上是執(zhí)行上下文的一個(gè)屬性,的值在進(jìn)入到執(zhí)行上下文的時(shí)候就已經(jīng)確定了,且不會(huì)再改變。默認(rèn)綁定這種情況下,不屬于任何一個(gè)函數(shù)方法內(nèi),即在全局作用域下,這種情況下稱(chēng)為默認(rèn)綁定。最后的總結(jié)用偽代碼的形式來(lái)表示例外例外本文參考 this的幾種用法 關(guān)于this this是什么? 理論上this是執(zhí)行上下文的一個(gè)屬性,this的值在進(jìn)入到執(zhí)行上下文的時(shí)候就已經(jīng)確定了,且不會(huì)...
摘要:是什么本質(zhì)是一個(gè)綁定,在函數(shù)被調(diào)用時(shí)建立。它的指向是完全由函數(shù)被調(diào)用的調(diào)用點(diǎn)來(lái)決定的。因?yàn)楹瘮?shù)的調(diào)用點(diǎn)在全局作用域,所以指向全局變量這里就是函數(shù)的調(diào)用點(diǎn)存在的意義在函數(shù)體內(nèi)部指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。從而實(shí)現(xiàn)干凈的設(shè)計(jì)和更容易的復(fù)用。 this是什么? this 本質(zhì)是一個(gè)綁定, 在函數(shù)被調(diào)用時(shí)建立。它的指向是完全由函數(shù)被調(diào)用的調(diào)用點(diǎn)來(lái)決定的。 function baz() { ...
閱讀 1383·2021-09-04 16:40
閱讀 3500·2021-07-28 00:13
閱讀 2926·2019-08-30 11:19
閱讀 2655·2019-08-29 12:29
閱讀 3207·2019-08-29 12:24
閱讀 1159·2019-08-26 13:28
閱讀 2438·2019-08-26 12:01
閱讀 3491·2019-08-26 11:35