请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于函数参数的作用域

let x =4
function foo(y=x){
let x = 2
console.log(y)
}

foo() //输出的是 4

老师原来function(y=x) 括号里面是单独的作用域呀?
我以为只有全局作用域,块级作用域,函数作用域,我以前一直以为()里面的参数是属于函数作用域,今天才发现并不是。

那老师这种function(y=x)叫做参数作用域吗?

关于arguments的补充
下面内容引用自红宝书第66页
图片描述
图片描述

上面描述改变参数值并不会改变arguments的值
但是输出结果出来却跟这句话是矛盾的

    function b(a,) {
        a = 10;
        console.log(arguments[0])
    }
    b(1) // 10

看了老师说的这个帖子,就发现我理解的raguments跟老师的实验有点偏差,接着回头再看红宝书,发现确实是红宝书错了。老师是它错了吗?

正在回答

2回答

问题中红宝书的截图中红框的部分,不能说他是错的,只是没有把场景描述清楚,毕竟书是翻译过来的所以应该可以理解。


1、按照你的例子:

function b(a) {
   a = 10;
   console.log(arguments[0])
}
b(1) // 10

按照你这个例子的话,貌似书里是错的。 

别急,继续往下看:

2、我再举个例子:

function fn(a, b){

   b = 10;

   console.log(arguments[1]);

}

fn(1, 2); // 10

fn(1); // undefined

仔细看下我这个例子中两次调用有什么区别?

是传递参数个数的区别,如果实参个数 小于 形参个数,那么多出的形参和arguments会失去映射关系。

0 回复 有任何疑惑可以回复我~
  • 提问者 Panda_io #1
    老师您太强了,这次我完全理解了!感谢老师!!!
    回复 有任何疑惑可以回复我~ 2020-08-21 15:46:28
谢成 2020-08-21 09:17:50

建议可以看下这个帖子,里面有对这块知识的案例: http://coding.imooc.com/learn/questiondetail/201635.html


0 回复 有任何疑惑可以回复我~
  • 提问者 Panda_io #1
    谢谢老师,老师回答得很详细,我明白了,但是这种改变参数值就改变arguments里面的值,跟著名的红宝书论述的知识点有点冲突,经过试验测试,红宝书的这个知识点确实能够被推翻,我把案例补充在上面请老师指正一下。
    回复 有任何疑惑可以回复我~ 2020-08-21 11:56:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信