在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 遇到一道關(guān)于作用域的題,求解

遇到一道關(guān)于作用域的題,求解

clipboard.png

非常不明白為什么上述代碼會(huì)輸出‘x’。
首先iife應(yīng)該不存在變量提升,變量提升只存在于函數(shù)聲明,而不是函數(shù)表達(dá)式。
其次在:

(function (foo) {

console.log(foo) // x
foo = 'y';

})(foo);

確實(shí)能取到外部的foo值。但是為什么最后return foo值還是沒有變 求大佬解答!!

回答
編輯回答
孤影

(function(){

var foo = "x";
(function(a){
    a="y";
})(foo);
return foo;

})();
你那個(gè)等價(jià)于這個(gè) 這樣應(yīng)該易懂一點(diǎn)吧

2018年7月17日 12:46
編輯回答
懶洋洋

js函數(shù)重新開辟新內(nèi)存棧,不管是不是立即執(zhí)行函數(shù)。 那么函數(shù)形參 你這里取名字為foo 。
執(zhí)行的時(shí)候 外面foo的值傳入 ,注意不是引用,了解了吧

2017年12月6日 11:20
編輯回答
心夠野

你在里面 console.log 的傳遞進(jìn)去的參數(shù)啊。也就是這個(gè)函數(shù)里面的局部變量

2017年8月17日 22:05
編輯回答
孤巷

經(jīng)過一番精細(xì)的閱讀,原來(lái)的答案確實(shí)有待商榷。

根據(jù)JavaScript高級(jí)程序設(shè)計(jì)一書中的描述,因?yàn)镴S函數(shù)產(chǎn)生的閉包,導(dǎo)致參數(shù)的傳遞是以復(fù)制的形式進(jìn)行的。

首先,函數(shù)(立即執(zhí)行函數(shù)也是函數(shù))外部聲明的變量,對(duì)于函數(shù)內(nèi)部來(lái)說(shuō)是可見的,且閉包的特性導(dǎo)致同名的變量以就近原則使用。

再來(lái)說(shuō)函數(shù)傳遞參數(shù),函數(shù)內(nèi)部可以使用一個(gè)arguments參數(shù),這代表js在為函數(shù)生成閉包的時(shí)候,將傳入的參數(shù)在函數(shù)體內(nèi)部聲明并賦值了一份。聲明當(dāng)然就是用形參的字面量作為變量名,而賦值則是將傳入的參數(shù)復(fù)制到聲明的形參變量上。這個(gè)復(fù)制可以跟大多數(shù)面向?qū)ο蟮恼Z(yǔ)言一樣理解,基礎(chǔ)類型是值得復(fù)制(棧上的拷貝),引用類型是指針的復(fù)制(堆上的指針指向同一個(gè)引用實(shí)例)。

var a = 'string'  // 字符串,數(shù)字等都屬于基本類型
function t(a){
    a = 'newString';
}
t(a); // 這里實(shí)際上將 a復(fù)制一份到方法t的形參a上
// 所以方法內(nèi)修改的a是棧上的另一塊兒區(qū)域
console.log(a); // string
var obj = {name: "jack"};
function s(obj){
    obj.name = "tony";
}
s(obj); // 這里將指向{name: "jack"}這塊兒實(shí)際內(nèi)存的指針復(fù)制了一份給方法s的參數(shù)obj
// 方法體內(nèi)obj是形參,也就是另一個(gè)指向{name: "jack"}這塊兒實(shí)際內(nèi)存的指針
// 但是里外的兩個(gè)obj都是指向同一塊兒內(nèi)存區(qū)域
2017年2月5日 11:36
編輯回答
旖襯

這里是值傳遞(也就是把x傳進(jìn)去了,而不是把foo變量傳進(jìn)去),如果foo指向一個(gè)對(duì)象,那就是引用傳遞,在里面修改foo,會(huì)作用到外面

(function(){
    var foo = {a:1,b:"s"};
    (function (foo) {
        foo.a = 'y';
    })(foo);
    return foo;
})();
//{a:"y",b:"s"}
2017年11月18日 06:29
編輯回答
影魅

首先,顯然、執(zhí)行外層IIFE過程中里面的IIFE會(huì)執(zhí)行(且沒有return)、執(zhí)行完后銷毀,雖然里面IIFE能讀到外面的foo,且能改變foo的值,但隨后即銷毀,不污染外層IIFE中的foo。
接著,外層IIFE繼續(xù)(foo是‘x’),并因?yàn)閞eturn foo,返回'x'。

2017年7月31日 13:25