一.作用域
1.什么是作用域?
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。
ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let和const 来体现。
2.全局作用域
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
1.所有未定义直接赋值的变量自动声明为拥有全局作用域。
function Fun1(){
a ='直接赋值的变量';
var b='内层变量'
}
Fun1();
console.log(a);//直接赋值的变量
console.log(b);//b is not defined
2.最外层函数和最外层函数外面定义的变量拥有全局作用域。
var A='最外层变量';//最外层函数
function outFun(){//最外层函数
var B ='最外层函数的内层变量'
function innerFun(){//内层函数
var C='内层函数的内部变量'
}
}
console.log(A);//最外层变量
outFun()
innerFun()
3.window 对象的属性拥有全局作用域。
let num =5
function fn1(){
let num =10;
console.log(num);
function fn2(){
let num = 30;
console.log(num);
}
fn2()
}
fn1()
console.log(num);
3.局部作用域
用var声明的所有变量,都是函数的局部变量,具有局部作用域,即变量只能在函数内部使用,不能在外部使用。
function fun(){
var sum = 0;
console.log(sum);
}
fun()
console.log(sum);
4.块级作用域
ES6 可以使用let关键字或者const关键字来实现块级作用域。
let或const声明的变量只在let或const命令所在的代码块 {} 内有效,在 {} 之外不能访问。
function f1(){
let n = 5;
if(true){
let n = 10;
}
console.log(n); // 5
}
5.匿名函数
匿名函数的几种形式
1.声明一个函数直接赋值
function fn(){
console.log('666');
}
var show = function(){
alert('hello');
};
3.show();执行匿名函数,自执行语法
(function(){
let num=10
console.log('111');
})()
6.this指向
this是一个使用在作用域内部(块级作用域、函数作用域、全局作用域)的关键字。 this关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向调用它的对象
console.log(this);//window
console.log(this === window);//true