JavaScript 作用域
定义:作用域是可访问变量,对象,函数的集合的集合及作用的范围。
全局作用域,局部作用域
全局作用域
- 组件编写在script标签中的js代码.都在全局作用域
- 全局作用域在页面打开时创建,在页面关闭时销毁
- 在全局作用域中有一个全局对象window,外面可以直接使用。(它代表是一个游览器的窗口,他由游览器创建直接使用)
- 在全局作用域中
创建的变量都会作为window对象的属性保存
创建的方法都会作为window对象的方法保存 - 全局作用域的变量都是全局变量
在页面上任意的部分都可以访问到
全局作用域中的声明提前
一、变量的声明提前
使用var关键字声明的变量 会在所有的代码执行之前被声明,(但是不会赋值)
但是如果不声明变量时,不使用var关键字,这变量不会被声明提前
console.log(a);
var a = 123;
二、函数的声明提前
所有函数声明形式创建的函数 function函数(){}
他会在所有的代码执行之前就被创建,所有外面可以在函数声明前来调用函数
使用函数表达式,不会被声明提前,使用不能提前调用.
* //函数声明,会被提前创建
* fun();
* function fun(){
console.log("fun函数1")
}
* //函数表达式,不会被提前创建
var fun2 = function(){
console.log("fun函数2")
}
fun2();
函数作用域(局部作用域)
- 调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁
- 每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的
- 在函数作用域中可以访问到全局作用域的变量
- 在全局作用域无法访问到函数作用域的变量
- 当在函数作用域操作一个变量时,它会在自身作用域寻找,如果有,则直接使用
- 如果没有,则向上一级作用域中寻找,直到找到全局作用域,如果没有,则会报引入错.
函数作用域中的声明提前
- 在使用var 关键字声明的变量,会在函数中所有的代码执行前被声明
- 函数声明也会在函数中所有的代码执行之前执行
- 在函数中不所有var声明的变量,都会成为全局变量
- 定义形参就相对于在函数作用域中声明了变量
var a = 10;
function fun() {
var a = 20;
var b=20
console.log("a="+a)
}
console.log("a="+a)
// console.log("b="+b);
fun();
// var fun2 = function() {
// console.log("fun函数2")
// }
// fun2();
this指向
定义:解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,这个对象我们称为函数执行的上下文对象。
根据函数的调用方法的不同,this指向不同的对象;
- 在方法中,this 表示该方法所属的对象。
- 如果单独使用,this 表示全局对象。
- 在函数中,this 表示全局对象。
- 在函数中,在严格模式下,this 是未定义的(undefined)
- 在事件中,this 表示接收事件的元素。
- 类似 call() 和 apply() 方法可以将 this 引用到任何对象。
通俗来说:
函数调用时 this永远都是window
以方法的形式调用时,this就是调用方法的那个对象
谁调用,this指向谁
var name = "全局";
function fun(){
console.log(this.name);
}
var obj = {
name : "名称",
sayName : fun, //调用函数fun
};
var obj2 = {
name : "名称2",
sayName : fun,
};
obj2.sayName();
fun();