遇到一道关于作用域的题,求解

https://img2.mukewang.com/5c8f08e00001ece004600376.jpg

非常不明白为什么上述代码会输出‘x’。
首先iife应该不存在变量提升,变量提升只存在于函数声明,而不是函数表达式。
其次在:

(function (foo) {

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

})(foo);

确实能取到外部的foo值。但是为什么最后return foo值还是没有变 求大佬解答!!


有只小跳蛙
浏览 622回答 5
5回答

UYOU

(function(){var foo = "x";(function(a){    a="y";})(foo);return foo;})();你那个等价于这个 这样应该易懂一点吧

蝴蝶刀刀

js函数重新开辟新内存栈,不管是不是立即执行函数。 那么函数形参 你这里取名字为foo 。 执行的时候 外面foo的值传入 ,注意不是引用,了解了吧

BIG阳

首先,显然、执行外层IIFE过程中里面的IIFE会执行(且没有return)、执行完后销毁,虽然里面IIFE能读到外面的foo,且能改变foo的值,但随后即销毁,不污染外层IIFE中的foo。接着,外层IIFE继续(foo是‘x’),并因为return foo,返回'x'。

德玛西亚99

这里是值传递(也就是把x传进去了,而不是把foo变量传进去),如果foo指向一个对象,那就是引用传递,在里面修改foo,会作用到外面(function(){    var foo = {a:1,b:"s"};    (function (foo) {        foo.a = 'y';    })(foo);    return foo;})();//{a:"y",b:"s"}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript