摘要:系列系列列表從看一與箭頭函數(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
上一篇說(shuō)到,use strict對(duì)arguments做了以下限定
arguments。不允許對(duì)arguments賦值。禁止使用arguments.callee。arguments不再追蹤參數(shù)的變化
這是為什么呢?如果你明白下面兩個(gè)例子就不用看這篇文章了~
arguments傳的是“值”function notChangeName(obj){ obj="change"; } function changeName(obj){ obj.name="change"; } var dog={ name:"dog" }; notChangeName(dog); //輸出Object {name: "dog"},沒(méi)改變 console.log(dog); changeName(dog); //輸出Object {name: "change"},改了 console.log(dog); //經(jīng)典例子,JavaScript高級(jí)程序設(shè)計(jì)的例子 function setName(obj){ obj.name="doge"; obj=new Object(); obj.name="cat"; } var person={}; setName(person); //doge console.log(person.name);嚴(yán)格模式下arguments會(huì)保持對(duì)同一“值”的引用
function notChangeName(name){ "use strict"; name="cat"; // 嚴(yán)格模式輸出dog,非嚴(yán)格輸出cat console.log(arguments[0]); } function changeName(obj){ "use strict"; obj.name="cat"; // 輸出cat console.log(arguments[0].name); } notChangeName("dog"); changeName({name:"dog"}); function dog(){ // "use strict"; //嚴(yán)格模式SyntaxError,非嚴(yán)格輸出"a" arguments="a"; console.log(arguments); } dog();arguments & js的變量、值、類(lèi)型 js的變量、值、類(lèi)型
js一個(gè)變量對(duì)應(yīng)一個(gè)值,一個(gè)值對(duì)應(yīng)一種類(lèi)型;而一種類(lèi)型對(duì)應(yīng)多個(gè)值,一個(gè)值對(duì)應(yīng)多個(gè)變量。
字符串的值不能改變,但能讓變量指向不同的值
舉兩個(gè)栗子:
no1.
var dog={ } var cat=dog; dog.name="doge"; var third={ name:"the third man" } // 輸出doge console.log(cat.name);
上述例子中,dog和cat是不同的變量,但指向同一個(gè)值,所以dog改變會(huì)反應(yīng)到cat上。third是另外一個(gè)變量,指向不同的值,而這兩個(gè)值有相同的類(lèi)型。如下圖
no2.
var str="doge"; // 輸出o console.log(str[1]); str[1]="c"; // 輸出o,字符串的值不能改變 console.log(str[1]); str="cat"; // 輸出c,變量指向了不同的值 console.log(str[0]);arguments傳的是值
所以,在前面的例子中,notChangeName函數(shù)內(nèi)部將變量obj指向不同的值,外部的dog指向同一個(gè)值且值未發(fā)生變化。因而不能改變dog的name。
changeName函數(shù)中,obj和dog指向同一個(gè)值,更改obj的name就等于更改了dog的name。
JavaScript高級(jí)程序設(shè)計(jì)的例子同理。如下:
function notChangeName(obj){ obj="change"; } function changeName(obj){ obj.name="change"; } var dog={ name:"dog" }; notChangeName(dog); //輸出Object {name: "dog"},沒(méi)改變 console.log(dog); changeName(dog); //輸出Object {name: "change"},改了 console.log(dog); //經(jīng)典例子,JavaScript高級(jí)程序設(shè)計(jì)的例子 function setName(obj){ obj.name="doge"; obj=new Object(); obj.name="cat"; } var person={}; setName(person); //doge console.log(person.name);
use strict下的arguments會(huì)保持對(duì)“值”的引用,因而arguments變量是不能被重新賦值的,如果強(qiáng)制賦值呢?比如arguments="a",那就強(qiáng)制報(bào)錯(cuò),沒(méi)得商量。
也是因?yàn)楸3謱?duì)“值”的引用,arguments不再追蹤參數(shù)的變化,但如果參數(shù)是obj且改變的是“值”,而不是重新賦值,那就不一樣了。如下:
function notChangeName(name){ "use strict"; name="cat"; // 嚴(yán)格模式輸出dog,非嚴(yán)格輸出cat console.log(arguments[0]); } function changeName(obj){ "use strict"; obj.name="cat"; // 輸出cat console.log(arguments[0].name); } notChangeName("dog"); changeName({name:"dog"}); function dog(){ // "use strict"; //嚴(yán)格模式SyntaxError,非嚴(yán)格輸出"a" arguments="a"; console.log(arguments); } dog();面試會(huì)考:arguments不是數(shù)組
這就是一個(gè)點(diǎn)而已,arguments不是數(shù)組,是個(gè)類(lèi)數(shù)組對(duì)象,沒(méi)有數(shù)組的push、pop、map那些方法,那如何把它變?yōu)閿?shù)組呢?循環(huán)遍歷一遍也是可以的,arguments有長(zhǎng)度,但有更簡(jiǎn)單的方法,如下:
function argToArr(index){ var newArg=Array.prototype.slice.apply(arguments); newArg.push(2); } argToArr(1);
為何不直接
arguments=Array.prototype.slice.apply(arguments);
因?yàn)楝F(xiàn)在很多都用use strict了,這個(gè)會(huì)報(bào)錯(cuò),還不知道為何會(huì)報(bào)錯(cuò)的再看一遍文章哈,自覺(jué)點(diǎn)
最后談?wù)刟rguments.callee這個(gè)用來(lái)干啥呢,它能在函數(shù)內(nèi)部調(diào)用自己,常用來(lái)解耦和。比如寫(xiě)個(gè)斐波那契數(shù)列函數(shù)
function fib(n){ if(n===1||n===2){ return 1; } return fib(n-1)+fib(n-2); }
這個(gè)問(wèn)題在哪呢,耦合性太強(qiáng),改了外層的fib,內(nèi)部函數(shù)名稱(chēng)也得改。可以用arguments.callee改進(jìn)
function fibArg(n){ if(n===1||n===2){ return 1; } return arguments.callee(n-1)+arguments.callee(n-2); }
問(wèn)題是這個(gè)在嚴(yán)格模式下不能運(yùn)行。不繞了,來(lái)個(gè)終極方法
var fib=(function f(n){ "use strict"; if(n===1||n===2){ return 1; } return f(n-1)+f(n-2); })
這種模式之后還會(huì)涉及,跟立即執(zhí)行函數(shù)類(lèi)似,jQuery這些也用了,以后再聊~
等等好像沒(méi)談為何要這樣限定arguments!
夜已深,就不繼續(xù)悟道了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/82467.html
摘要:其次,指向有一個(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 stri...
摘要:主要知識(shí)點(diǎn)有函數(shù)參數(shù)默認(rèn)值剩余參數(shù)擴(kuò)展運(yùn)算符屬性塊級(jí)函數(shù)箭頭函數(shù)以及尾調(diào)用優(yōu)化深入理解筆記目錄函數(shù)的默認(rèn)參數(shù)在中,我們給函數(shù)傳參數(shù),然后在函數(shù)體內(nèi)設(shè)置默認(rèn)值,如下面這種方式。擁有方法的函數(shù)被稱(chēng)為構(gòu)造器。 主要知識(shí)點(diǎn)有:函數(shù)參數(shù)默認(rèn)值、剩余參數(shù)、擴(kuò)展運(yùn)算符、new.target屬性、塊級(jí)函數(shù)、箭頭函數(shù)以及尾調(diào)用優(yōu)化showImg(https://segmentfault.com/img/...
摘要:錯(cuò)誤的寫(xiě)法錯(cuò)誤的寫(xiě)法中的構(gòu)造函數(shù)新增了支持默認(rèn)參數(shù)和不定參數(shù)。箭頭函數(shù)的簡(jiǎn)單理解箭頭函數(shù)的左邊表示輸入的參數(shù),右邊表示輸出的結(jié)果。但是有了尾調(diào)用優(yōu)化之后,遞歸函數(shù)的性能有了提升。 作為前端切圖仔,越發(fā)覺(jué)得自己離不開(kāi)函數(shù)了。 說(shuō)到JavaScript函數(shù),腦子里都是匿名函數(shù)、普通函數(shù)、閉包函數(shù)、構(gòu)造函數(shù)......然后還能說(shuō)出一大堆函數(shù)的概念。如果你達(dá)到這個(gè)水平,那么函數(shù)對(duì)你來(lái)說(shuō)沒(méi)有難度...
摘要:作為對(duì)象原型鏈的終點(diǎn)。調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)有提供,該參數(shù)等于。它可以用于引用該函數(shù)的函數(shù)體內(nèi)當(dāng)前正在執(zhí)行的函數(shù)。 一 JS 二 CSS 一 JS ==和===的區(qū)別 ===叫做嚴(yán)格運(yùn)算符 ==叫做相等運(yùn)算符嚴(yán)格運(yùn)算符比較時(shí)不僅僅比較數(shù)值還要比較數(shù)據(jù)類(lèi)型是否一樣相等運(yùn)算符在比較相同類(lèi)型的數(shù)據(jù)時(shí),與嚴(yán)格相等運(yùn)算符完全一樣。 在比較不同類(lèi)型的數(shù)據(jù)時(shí),相等運(yùn)算符會(huì)先將數(shù)據(jù)進(jìn)行類(lèi)型轉(zhuǎn)換,...
閱讀 2281·2021-11-16 11:44
閱讀 650·2019-08-30 15:55
閱讀 3285·2019-08-30 15:52
閱讀 3624·2019-08-30 15:43
閱讀 2207·2019-08-30 11:21
閱讀 445·2019-08-29 12:18
閱讀 1959·2019-08-26 18:15
閱讀 481·2019-08-26 10:32