美文网首页
一、块级作用域绑定

一、块级作用域绑定

作者: 入秋未凉的海 | 来源:发表于2017-09-14 00:01 被阅读0次
var声明及变量提升机制
function getValue(condition){
    if(condition){
        var value = "blue";
        return value;
    } else {
        console.log(value);
    }
    console.log(value);
}
getValue(0)
//undefined
//undefined

在预编译阶段js引擎会将上面函数修改成下面这样

function getValue(condition){
    var value
    if(condition){
        value = "blue";
        return value;
    } else {
        console.log(value);
    }
    console.log(value);
}
块级声明
function getValue(condition){
    if(condition){
        let value = "blue";
    } else {
        //变量value在此处不存在
        return null
    }
    //变量value在此处不存在
}
var count = 30;
let count = 30;
//Uncaught SyntaxError: Identifier 'count' has already been declared
var count = 30;
if(condition){
    let count = 10;
    //不会抛出错误
}
const maxItems = 30;
const name;
//Uncaught SyntaxError: Missing initializer in const declaration
const maxItems = 5;
maxItems = 6;
//Uncaught TypeError: Assignment to constant variable.
const person = {name: 'binperson'}
//可修改对象属性的值
person.name = 'bin'
//抛出语法错误
person = {
    name: 'bin'
}
//Uncaught TypeError: Assignment to constant variable.
临时死区(TDZ)
if(condition){
    console.log(typeof value);//引用错误!
    let value = "blue";
}
//Uncaught ReferenceError: value is not defined
console.log(typeof value) //"undefined"

if(condition){
    let value = "blue";
}

//循环中的块作用域绑定

for(var i = 0; i < 10; i++){

}
console.log(i)//10

for(let j = 0; j < 10; j++){

}
//i在这里不可访问,抛出一个错误
console.log(j);
//Uncaught ReferenceError: j is not defined
var funcs = [];
for (var i=0; i < 10; i++){
    funcs.push(function(){
        console.log(i);
    });
}
funcs.forEach(function(func){
    func();//输出10次数字10
});
var funcs = [];
for(var i = 0; i < 10; i++){
    funcs.push(function(value){
        return function(){
            console.log(value);
        }
    }(i));
}

funcs.forEach(function(func){
    func();//输出0,然后1、2,直到9
});
var funcs = []

for(let i = 0; i < 10; i++){
    funcs.push(function(){
        console.log(i);
    })
}
funcs.forEach(function(func){
    func();//输出0,然后1、2,直到9
});
var funcs = [],
    object = {
        a: true,
        b: true,
        c: true
    };
for(let key in object){
    funcs.push(function(){
        console.log(key);
    })
}
funcs.forEach(function(func){
    func();//输出a、b、c
})
//如果使用var声明key,则都会输出c
var funcs = []

for(const i = 0; i < 10; i++){
    funcs.push(function(){
        console.log(i);
    })
}
funcs.forEach(function(func){
    func();
});
//Uncaught TypeError: Assignment to constant variable.
var funcs = [],
object = {
    a: true,
    b: true,
    c: true
};
for(const key in object){//每次迭代不会修改已有绑定,而是会创建一个新绑定
    funcs.push(function(){
        console.log(key);
    })
}
funcs.forEach(function(func){
    func();//输出a、b、c
})
//浏览器中
var RegExp = "Hello!";
console.log(window.RegExp); //"Hello!"

var ncz = "Hi!";
console.log(window.ncz);//"Hi!"
//let或const不能覆盖全局变量,而只能屏蔽它
let RegExp = "Hello!";
console.log(RegExp);//"Hello!"
console.log(window.RegExp); //ƒ RegExp() { [native code] }
console.log(window.RegExp === RegExp)//false

const ncz = "Hi!";
console.log(ncz);//"Hi"
console.log(window.ncz);//"Hi!"
console.log(window.ncz === ncz); //true
console.log("ncz" in window)//false
  • 如果希望在全局对象下定义变量,仍然可以使用var。这种情况常见于在浏览器中跨frame或跨window访问代码
块级绑定最佳实践的进化
  • 默认使用const,只有确实需要改变变量的时使用let

相关文章

  • 块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在...

  • 块级作用域绑定

    在函数作用域或全局作用域中通过关键字var声明变量,但是无论在哪里声明,都会被当成在当前作用域顶部声明的变量,这就...

  • 一、块级作用域绑定

    var声明及变量提升机制 在预编译阶段js引擎会将上面函数修改成下面这样 块级声明 临时死区(TDZ) //循环中...

  • 深入理解ES6(2)

    第1章 块级作用域绑定 1. var声明及变量提升(Hoisting)机制 基于js原生是没有块级作用域的,看下面...

  • 《深入理解ES6》学习笔记(第三天)

    《深入理解ES6》学习笔记(第三天) 第一章 块级作用域绑定 第2节 块级声明块级声明用于声明在指定块的作用域之外...

  • 一、块级绑定

    ES2015 一、块级绑定 1、let、const和块级作用域 var 变量提升(hoisting )   使用v...

  • js 作用域

    js 作用域主要有:全局作用域和局部作用域,es5之前没有块级作用域,es6有了块级作用域 何为块级作用域,块级作...

  • let、const和var的区别(个人笔记)

    1. 区别 (1)块级作用域块作用域由{ }包括,let和const具有块级作用域,var不存在块级作用域。块级作...

  • 读《深入理解ES6》

    第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...

  • 第七章 块级作用域、私有变量

    模仿块级作用域 私有变量  js没有块级作用域,只有全局作用域和局部作用域(函数作用域),块级作用域是指某一部分代...

网友评论

      本文标题:一、块级作用域绑定

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