国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

從use strict看JS(二):函數(shù)傳參模式與arguments

kycool / 2655人閱讀

摘要:系列系列列表從看一與箭頭函數(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 的 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

相關(guān)文章

  • use strictJS(一):this箭頭函數(shù)

    摘要:其次,指向有一個(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...

    darcrand 評(píng)論0 收藏0
  • 深入理解ES6筆記(三)函數(shù)

    摘要:主要知識(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/...

    aristark 評(píng)論0 收藏0
  • 《深入理解ES6》筆記——函數(shù)(3)

    摘要:錯(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)有難度...

    DoINsiSt 評(píng)論0 收藏0
  • 前端面經(jīng)整理之JS和CSS

    摘要:作為對(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)換,...

    stonezhu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

kycool

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<