[面试题] 函数默认参数作用域

今天看到了一道很有意思的面试题,在听完老师的讲解后,我决定也和大家讲讲这道题

成都创新互联公司是一家集网站建设,定陶企业网站建设,定陶品牌网站建设,网站定制,定陶网站建设报价,网络营销,网络优化,定陶网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

var x = 0
function foo(x, y = function() { x = 3; console.log(x) }) {
  console.log(x)
  var x = 2
  y()
  console.log(x)
}
foo()
console.log(x)

大家可以想想这道题的答案是什么?

????????????好 时间到

接下来我来讲讲这道题

要想做对这道题 我们得先知道一个概念

函数中的参数如果有默认值的情况下,那么他是会形成一个参数作用域的

或许有小伙伴会不相信,为啥你说会形成作用域就形成作用域呢?

那么 我们来看下官方ecma给出的解释是什么?

小伙伴们,可以仔细读一读这一段话.我简单翻译一下

如果函数的形参不包含任何默认的值,那么函数作用域将会与参数共享一个作用域

如果默认参数存在的话,那么会形成一个参数作用域

好滴 我们现在分析下

var x = 0;

//函数有默认值的时候 会形成一个参数作用域
function foo(x, y = function () { x = 3; console.log(x) }) {
    //第一个输出的时候 会先去寻找函数内部作用域有没有x的声明
    //小伙伴可能会有疑惑,这个var申明的不是会有变量提升嘛?
    //我来解释一下 如果有默认值的话 x会先去参数作用域寻找
    //显然 在这个之前是没有声明的 所以会去函数寻找默认值形成的参数作用域
    //这时候 x的值是 undefined
    console.log(x);
    var x = 2;
    //执行y 这时候的y函数内的值是去寻找参数作用域内的x
    //给参数作用域内的x 赋值为3 所以输出为3
    y();
    //最后这个输出x 在函数内的作用域寻找
    //找到了var x=2 这个声明
    //所以输出2
    console.log(x);
}

foo();
// 这个输出x是去寻找全局的x
//这时候的全局x=0 输出为0
console.log(x);

好 我们现在已经分析完了 大家可以仔细看看

总体而言还是比较简单的


网页题目:[面试题] 函数默认参数作用域
文章链接:http://scyanting.com/article/dsopode.html