作用域
作用域就是变量和函数得可访问范围,控制着变量和函数得可见性与生命周期,
在JavaScript中变量的作用域:全局作用域和局部作用域
全局作用域:
任何函数的内部都可以访问的到
var jeck = "jeck"
function fn() {
console.log(jeck)
}
fn() //result:jeck
局部租作用域:
一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的
function fn() {
console.log(jeck); //undefined
var jeck= "jeck";
console.log(jeck); //jeck
}
fn();
console.log(jeck); // ReferenceError: jeckis not defined
注意:只要函数内定了局部变量,函数在解析的时候都会将这个变量“提前声明”
function fn() {
var jeck; //提前声明了局部变量
console.log(jeck) //undefined
jeck = "jeck"
console.log(jeck) //jeck
}
fn()
console.log(jeck) // ReferenceError: inner is not defined
函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
function fn(){
jeck = "jeck"
}
fn()
console.log(jeck) //jeck
块级作用域
在java中作用域就是一个{}花括号是会计作用域,而在JavaScript没有块级作用域,只有函数作用域。
ES6中的作用域
由于ES5中存在很多问题,所以在ES6中,用let替换了var的声明,不过为了兼容ES5还是可以使用以前的var。不过还是建议用let
let为js添加了新的作用域就是块级作用域。
for (let i = 0; i < 10; i++) {
console.log(i) //0,1,2,3,4,5,6,7,8,9
}
console.log(i) //i is not defined
我们就完全可以使用java等语言,来理解变量的声明了,而且使用let声明变量,再声明是不可以用的
a = 3
let a = 100
alert(a) // a is not defined
let不像var那样会发生“变量提升”现象,所以,变量一定要在声明后使用,否则报错
ES6明确规定,如果区块内存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,在语法上称为暂时性死区
作用域链(SCOPE Chain)
作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问
我的理解就是,根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问。
name = "1"
function t() {
var name = "2"
function s() {
var name = "3"
console.log(name)
}
function ss() {
console.log(name)
}
s() //3
ss() //2
}
t()
延长作用域链
with语句:with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部
person={name:"wj",age:20,height:165,friend:{name:"wtw",age:21}};
with(person.friend){
console.log(name); //wtw
}