首页 >> js开发 >> jses6函数中的作用域实例分析js大全
jses6函数中的作用域实例分析js大全
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
本文实例讲述了es6函数中的作用域。分享给大家供大家参考,具体如下:一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值,是不会出现的。
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2) // 2
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2) // 2
上面的代码中,参数y的默认值等于变量x。调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2。再看下面的例子。
let x = 1;
function f(y = x) {
let x = 2;
console.log(y)
}
let x = 1;
function f(y = x) {
let x = 2;
console.log(y)
}
上面代码中,函数f调用时,参数y = x形成一个单独的作用域,这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x。如果此时,全局变量x不存在,就会报错。
function f(y = x) {
let x = 2;
console.log(y)
}
f() // ReferenceError: x is not defined
function f(y = x) {
let x = 2;
console.log(y)
}
f() // ReferenceError: x is not defined
下面这样写,也会报错。
var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined
var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined
上面代码中,参数x = x形成一个单独作用域,实际执行的是 let x = x,由于暂时性死区的原因,这行代码会报错"x未定义"。如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。请看下面的例子。
let foo = 'outer'
function bar(func = () => foo) {
let foo = 'inner';
console.log(func())
}
bar() // outer
let foo = 'outer'
function bar(func = () => foo) {
let foo = 'inner';
console.log(func())
}
bar() // outer
上面代码中,函数bar的参数func的默认值是一个匿名函数,返回值是变量foo。函数参数形成的单独的作用域里面,并没有定义变量foo,所以foo指向外层的全局变量foo,因此输出outer。如果写成下面这样,就会报错。
function bar (func = () => foo) {
let foo = 'inner'
console.log(func())
}
bar() // ReferenceError: foo is not defined
function bar (func = () => foo) {
let foo = 'inner'
console.log(func())
}
bar() // ReferenceError: foo is not defined
上面代码中,匿名函数里面的foo指向函数外层,但是函数外层并没有声明变量foo,所以报错了。下面是一个更复杂的例子。
var x = 1;
function foo(x, y = function() {x = 2;}) {
var x = 3;
y()
console.log(x)
}
foo() // 3
x // 1
var x = 1;
function foo(x, y = function() {x = 2;}) {
var x = 3;
y()
console.log(x)
}
foo() // 3
x // 1
上面代码中,函数foo的参数形成一个单独作用域。这个作用域里面,首先声明了变量x,然后声明了变量y,y的默认值是一个匿名函数。这个匿名函数内部的变量x, 指向同一个作用域的第一个参数x。函数foo内部又声明了一个内部变量。该变量与第一个参数x由于不是同一个作用域,所以不是同一个变量,因此执行y后,内部变量x和外部全局变量x的值都没变。如果将var x = 3的var 去除,函数foo的内部变量x就指向第一个参数,与匿名函数内部的x是一致的,所以最后输出的就是2,而外层的全局变量x依然不受影响。感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools./code/HtmlJsRun测试上述代码运行效果。在线HTML/CSS/JavaScript代码运行工具在线HTML/CSS/JavaScript代码运行工具http://tools./code/HtmlJsRun关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》JavaScript常用函数技巧汇总javascript面向对象入门教程JavaScript错误与调试技巧总结JavaScript数据结构与算法技巧总结JavaScript数学运算用法总结希望本文所述对大家JavaScript程序设计有所帮助。
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2) // 2
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2) // 2
上面的代码中,参数y的默认值等于变量x。调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2。再看下面的例子。
let x = 1;
function f(y = x) {
let x = 2;
console.log(y)
}
let x = 1;
function f(y = x) {
let x = 2;
console.log(y)
}
上面代码中,函数f调用时,参数y = x形成一个单独的作用域,这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x。如果此时,全局变量x不存在,就会报错。
function f(y = x) {
let x = 2;
console.log(y)
}
f() // ReferenceError: x is not defined
function f(y = x) {
let x = 2;
console.log(y)
}
f() // ReferenceError: x is not defined
下面这样写,也会报错。
var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined
var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined
上面代码中,参数x = x形成一个单独作用域,实际执行的是 let x = x,由于暂时性死区的原因,这行代码会报错"x未定义"。如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。请看下面的例子。
let foo = 'outer'
function bar(func = () => foo) {
let foo = 'inner';
console.log(func())
}
bar() // outer
let foo = 'outer'
function bar(func = () => foo) {
let foo = 'inner';
console.log(func())
}
bar() // outer
上面代码中,函数bar的参数func的默认值是一个匿名函数,返回值是变量foo。函数参数形成的单独的作用域里面,并没有定义变量foo,所以foo指向外层的全局变量foo,因此输出outer。如果写成下面这样,就会报错。
function bar (func = () => foo) {
let foo = 'inner'
console.log(func())
}
bar() // ReferenceError: foo is not defined
function bar (func = () => foo) {
let foo = 'inner'
console.log(func())
}
bar() // ReferenceError: foo is not defined
上面代码中,匿名函数里面的foo指向函数外层,但是函数外层并没有声明变量foo,所以报错了。下面是一个更复杂的例子。
var x = 1;
function foo(x, y = function() {x = 2;}) {
var x = 3;
y()
console.log(x)
}
foo() // 3
x // 1
var x = 1;
function foo(x, y = function() {x = 2;}) {
var x = 3;
y()
console.log(x)
}
foo() // 3
x // 1
上面代码中,函数foo的参数形成一个单独作用域。这个作用域里面,首先声明了变量x,然后声明了变量y,y的默认值是一个匿名函数。这个匿名函数内部的变量x, 指向同一个作用域的第一个参数x。函数foo内部又声明了一个内部变量。该变量与第一个参数x由于不是同一个作用域,所以不是同一个变量,因此执行y后,内部变量x和外部全局变量x的值都没变。如果将var x = 3的var 去除,函数foo的内部变量x就指向第一个参数,与匿名函数内部的x是一致的,所以最后输出的就是2,而外层的全局变量x依然不受影响。感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools./code/HtmlJsRun测试上述代码运行效果。在线HTML/CSS/JavaScript代码运行工具在线HTML/CSS/JavaScript代码运行工具http://tools./code/HtmlJsRun关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》JavaScript常用函数技巧汇总javascript面向对象入门教程JavaScript错误与调试技巧总结JavaScript数据结构与算法技巧总结JavaScript数学运算用法总结希望本文所述对大家JavaScript程序设计有所帮助。
相关文章:
- jsvue props 一次传多个值实例js大全
- js在vue中created、mounted等方法使用小结js大全
- jseslint+prettier统一代码风格的实现方法js大全
- js解决Vue router-link绑定事件不生效的问题js大全
- jsvue 清空input标签 中file的值操作js大全
- js解决vue的touchStart事件及click事件冲突问题js大全
- js解决vue 给window添加和移除resize事件遇到的坑js大全
- js微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现js大全
- jsvue 弹出遮罩层样式实例js大全
- js解决vue组件销毁之后计时器继续执行的问题js大全