为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

有只小跳蛙 2019-03-06 14:15:03
非常不明白为什么上述代码会输出‘x’。首先iife应该不存在变量提升,变量提升只存在于函数声明,而不是函数表达式。其次在:(function (foo) {console.log(foo) // x foo = 'y';})(foo);确实能取到外部的foo值。但是为什么最后return foo值还是没有变 求大佬解答!!
查看完整描述

5 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

(function(){


var foo = "x";

(function(a){

    a="y";

})(foo);

return foo;

})();

你那个等价于这个 这样应该易懂一点吧


查看完整回答
反对 回复 2019-03-18
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-03-18
?
BIG阳

TA贡献1859条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-18
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

这里是值传递(也就是把x传进去了,而不是把foo变量传进去),如果foo指向一个对象,那就是引用传递,在里面修改foo,会作用到外面


(function(){

    var foo = {a:1,b:"s"};

    (function (foo) {

        foo.a = 'y';

    })(foo);

    return foo;

})();

//{a:"y",b:"s"}


查看完整回答
反对 回复 2019-03-18
  • 5 回答
  • 0 关注
  • 621 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信