做分享衣服网站的初衷是什么意思,合肥网站建设与设计,免费广告,网站空间集装箱作用域
一般认为 JS 中作用域有三种#xff1a;
全局作用域#xff1a;一个脚本运行代码的默认作用域#xff1b;模块作用域#xff1a;一个模块运行代码的默认作用域#xff1b;函数作用域#xff1a;一个函数运行代码的默认作用域。
而由于 let/const 声明变量的作用…作用域
一般认为 JS 中作用域有三种
全局作用域一个脚本运行代码的默认作用域模块作用域一个模块运行代码的默认作用域函数作用域一个函数运行代码的默认作用域。
而由于 let/const 声明变量的作用域是比函数作用域更加具有块级属性的所以称块级作用域任何一个 {} 包围的代码都是一个块函数是特殊的块脚本是一个大的块模块是多个脚本的集合是更大的块。
函数是特殊的块这是由于函数体内就算是 var 声明的变量在外部也无法使用这和其他 {} 构成的块不同。换句话说var 只承认函数的块级作用域。
/* let/const 声明变量的作用域 */
{ let a 1; }
console.log(a) // 报错块内的变量在外部失效报未定义的错{ let a 1 }
{ console.log(a) } // 报错此块内没有变量afor (let i 0; i 5; i) { }
console.log(i) // 报错块内的变量在外部失效报未定义的错for (var i 0; i 5; i) { }
console.log(i) // 5 var 只承认函数的块级作用域闭包
闭包是 JS 中最强大的特性之一。尽管功能强大但除了完成特定任务时才会函数嵌套。
概念
JS 允许函数嵌套且根据 块/函数 的作用域特性内部可以访问外部声明定义的变量将外部函数声明的变量等组成的环境和一个内部函数组合封装起来就构成一个闭包。
在下面一个简单的计数器例子中内部函数 counter 和变量 n/init 组成的环境构成闭包。
注意返回的函数不能是 new Function 构造出来的Function 的传参模式是字符串指向全局环境无法访问外部函数环境。
function MakeCounter(init0) {let val init;function counter() { return val; }return counter
}let ctr MakeCounter(10)
ctr() // 10
ctr() // 11
ctr() // 12模拟私有方法
由于闭包环境变量的私有性容易想到用来模拟一些私有方法。
下面一个相对复杂的计数器例子中私有属性 privateVal 只能通过公共方法 getValue 进行访问私有方法 changeBy 也只能通过其他公共方法调用。
function MakeCounter(init) {let privateVal init;function changeBy(delta) { privateVal delta; };return {getValue() { return privateVal; },increment() { changeBy(1); },decrement() { changeBy(-1); },plus(b) { changeBy(b); },minus(b) { changeBy(-b); },}
}let ctr MakeCounter(10);
ctr.value() // 10
ctr.increment()
ctr.plus(9)
ctr.value() // 20多个闭包共用一个环境?
将上面计数器的例子小改一下在返回的对象里增加一个值。
返回时一个对象包括一个值和五个函数
五个函数共用一个环境影响同一个环境值 val在完成返回后脱离该环境独立成为一个变量/属性。
function MakeCounter(init) {let privateVal init;function changeBy(delta) { privateVal delta; };return {val: PrivateVal,getValue() { return privateVal; },increment() { changeBy(1); },decrement() { changeBy(-1); },plus(b) { changeBy(b); },minus(b) { changeBy(-b); },}
}let ctr MakeCounter(10);
ctr.getValue() // 10
ctr.val // 10
ctr.increment()
ctr.plus(9)
ctr.getValue() // 20
ctr.val // 10
ctr.val 100
ctr.val // 100性能考量
闭包在处理速度和内存消耗方面对脚本性能具有负面影响闭包特性能达到的效果使用高级语法也能实现高手总是会闭包。