在ES5中,只全局作用域和函数作用域。这会导致函数作用域覆盖了全局作用域;亦或者循环中的变量泄露为全局变量。
例如:
// 1.函数作用域覆盖了全局作用域,发生了变量提升,函数声明大于var声明的变量,因此函数里面的a提到了前面,在打印a,初始化一个undefined给a,所以打印出了undefined。
var a = '1';
function fn() {
console.log(a);
if (3<2) {
var a = 3;
}
}
fn(); // undefined
// 2.循环中的变量泄露为全局变量
for(var i=0;i<5;i++) {
console.log(i);
}
console.log(i); // 5;
用let命令新增了块级作用域,外层作用域无法获取到内层作用域,非常安全明了。即使外层和内层都使用相同变量名,也都互不干扰。
// 1.外层作用域无法获取到内层作用域
function fn1() {
let a = 41;
if(1 == 1) {
let a = 3;
console.log(2,a); // 2 3
}
console.log(1,a); // 1 41
}
fn1();
{
{
let food = 'apple';
}
console.log(food); // Uncaught ReferenceError: food is not defined
}
{
{
let food = 'apple';
}
console.log(food); // Uncaught ReferenceError: food is not defined
}
// 2. 外层和内层都使用相同变量名,也都互不干扰
{
{
let food = 'apple';
console.log(food); // apple
}
let food = 'orange';
console.log(food); // orange
}
在ES5中,函数只能在顶级作用域和函数作用域中声明,不能在块级作用域中声明。但是在ES6中,函数可以在块级作用域中声明。
但是会有一定的问题,因为函数声明会被提到代码的最前面。所以会报错,最好在ES6中用函数表达式来表示一个函数。
例如:
//1.函数声明报错
{
if (4 < 2) {
function fn() {
console.log('我在函数里面!');
}
}
}
fn(); // Uncaught TypeError: fn is not a function
//2.函数表达式没错
{
let fa = '111';
let fn = function () {
console.log('我在函数里面!');
}
console.log(fa,fn); // 111 ƒ () { console.log('我在函数里面!');}
}
注意:ES6中允许函数在块级作用域中可以声明的条件是必须在大括号里面,否则就会报错。
// 1.报错的情况
if (4>2) {
let fn = function () {};
}
//2.报错的情况
if (4>2)
let fn = function () {}; // Uncaught SyntaxError: Lexical declaration cannot appear in a single-statement context
vue中的样式作用域是通过属性选择器来实现的,例如同样一个类名,我们是通过 .类名[属性名] 来做区分的,我们这里主要是要搞清楚这里的属性名是怎么分配的。
先声明一个name变量,然后声明一个person对象,person包含name和sayName属性。当直接在对象上进行方法的调用时:person.sayName(),函数的作用域遵循“谁调用就是谁”的原则,sayName的作用域(也就是this)指向的就是person。
JavaScript中没有块级作用域,块级作用域中声明的变量将被添加到当前的执行环境中。在JavaScript中,由for语句创建的变量,即使在for循环执行结束后,也依旧会存在于循环外部的执行环境中。
除了 JS 已有的功能外,Vue还具有自己独特的作用域级别。作用域控制可以使用哪些变量以及在何处使用。它控制它们对应用程序的不同部分的可见性。
全局作用域 − 全局变量定义在程序结构的外部,它可以在你代码的任何位置使用。类作用域 − 这个变量也可以称为 字段。类变量声明在一个类里头
JavaScript 预编译的过程和作用域的分析步骤是 JS 学习中重要的一环,能够帮助我们知道代码的执行顺序,更好理解闭包的概念;JavaScript 执行步骤:检查通篇的语法错误 -> 预编译 -> 解释执行
作用域是在函数声明的时候就确定的一套变量访问规则,而执行上下文是函数执行时才产生的一系列变量的集合体。也就是说作用域定义了执行上下文中的变量的访问规则,执行上下文是在这个作用域规则的前提下执行代码的。
某个执行环境在所有代码执行完毕后,这个执行环境就会被销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境直到应用退出,例如关闭网页或浏览器时销毁。
变量的作用域指变量有效的范围,与变量定义的位置密切相关,作用域是从空间的角度来描述变量的,也可以理解为变量的可见性。在某个范围内变量是可见的,也就是说,变量是可用的。
ES6新增了两个重要的关键字let和const,相信大家都不陌生,但是包括我在内,在系统学习ES6之前也只使用到了【不存在变量提升】这个特性。let声明一个块级作用域的本地变量
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!