美文网首页
es6函数默认参数作用域小记

es6函数默认参数作用域小记

作者: liujunyan | 来源:发表于2017-02-21 16:11 被阅读0次

使用默认参数时,参数会形成一个独立的作用域,此作用域与函数体中的作用域是平行关系

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

经过测试发现,此段代码如果使用babel编译成es5~输出结果为 2 2 0

Paste_Image.png

这个结果和开头的结论并不符合~原因我暂时将其理解成babel的编译和原本es6的语法定义还是有点出入的
编译后的代码如下:

var x = 0;
function foo(x) {
  var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
    x = 2;console.log(x);
  };

  var x = 3;
  y();
  console.log(x);
}
foo();
console.log(x);

而将es6代码直接复制到支持es6语法的浏览器中执行~得到结果为:

Paste_Image.png

解释如下:

参数y有一默认值为一匿名函数,一整个参数列表形成一个独立的作用域,在匿名函数中没有定义x,故找到了外部的x即第一个参数x,然后赋值为2,并输出,所以第一行输出2,然后在foo函数体中声明了变量x并赋值为3,但此句过后执行匿名函数,并没有影响到foo函数体中的x最后最后输出3,这就是我一开始说的参数形成的独立作用域与函数体中的作用域是平行的匿名函数中的变量x在没有声明的情况下应该是沿着作用域链往上找而往上找的时候并不是找到foo函数体中定义的x而是找到形参列表中的第一个参数x,所以匿名函数中x = 2;这句并没有修改到foo函数体中的x的值,由此也证明foo函数体的作用域和形参列表的独立作用于并不是上下级关系

再来看个例子:

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

结果为:

Paste_Image.png

解释:
此例foo函数体中并没有用var重新声明变量x,所以此处x就是传进来的参数x(平时我们调用函数也是这种写法,至少调用函数的时候不会在函数体中对传进来的形参再声明一边,不然传进来干嘛~~)匿名函数中变量x没有声明,此处的x就是外层变量x即形参列表中第一个参数x,那最后得出3 2 2的结果也就不难理解了

相关文章

  • 函数的拓展

    1、ES6允许为函数参数设置默认值,即直接卸载参数定义的后面。 2、参数的默认作用域 3、rest参数 ES6引入...

  • es6函数默认参数作用域小记

    使用默认参数时,参数会形成一个独立的作用域,此作用域与函数体中的作用域是平行关系 经过测试发现,此段代码如果使用b...

  • 1.ES6简介

    涉及到的内容有:常量、作用域、箭头函数、默认参数、对象代理。 适合学ES6的人:Git 、webpack 、JS

  • 14.JS基础之作用域与闭包

    作用域: 全局作用域 函数作用域 块级作用域(ES6新增) 常见的闭包有:作为函数返回值的闭包与作为函数参数的闭包...

  • ES6

    常量 ----只读 作用域 箭头函数 默认参数 对象代理

  • c++函数特性

    函数重载,参数默认值,内联函数 重载:函数名相同,参数列表不同,作用域相同。 参数默认值:参数默认值必须从最后开始...

  • ES5与ES6部分对比

    常量声明对比 作用域对比 块作用域对比 箭头函数 箭头函数会改变this的指向 默认参数 可变参数 就是在不确定传...

  • JS基础知识(2) -- 作用域和作用域链

    作用域 作用域就是变量与函数的可访问范围 全局作用域 函数作用域 ES6块级作用域 ES5没有块级作用域,ES6有...

  • es6学习笔记整理(六)函数扩展

    参数默认值 如果函数参数中没有默认值,并且调用的时候也没有赋值,这种写法是错的函数参数默认值作用域的问题 函数外面...

  • ES6学习第六节:Function扩展

    函数参数默认值 与解构赋值默认值结合使用 参数默认值的位置 函数的length属性 作用域 一旦设置了参数的默认值...

网友评论

      本文标题:es6函数默认参数作用域小记

      本文链接:https://www.haomeiwen.com/subject/msluwttx.html