this指向问题
1、this在执行的时候才会确定指向的是什么,不执行无法确定。
this的几种不同的使用场景
- 构造函数
- 对象属性
- 普通函数
- call、apply、bind
构造函数:
this先指向一个空对象,再对this赋值,最后返回this;
function Foo(name){
//this = {};
this.name = name;
//return this;
}
var a = new Foo('gouhuan');
对象:
var a ={
name:'A',
printName:function(){
console.log(this.name)
}
};
a.printName();//A
这个时候this指向a对象,this === a;
普通函数:
this指向window;
function fn(){
console.log(this);//window
}
call、apply、bind
call 与apply相似,只是传参的形式不同:
function fn1(name,age){
console.log(this);
console.log(name);
}
fn1('gouhuan');//window gouhuan
fn1.call({x:200},'gouhuan',20);//{x:200},gouhuan
//注意传参形式
fn1.apply({x:200},['gouhuan',20]);//{x:200},gouhuan
---
bind只能用于函数表达式,不可用于函数声明;
var fn2 = function(){
console.log(this)
}.bind({x:200})//{x:200};
作用域
js中没有块级作用域,只用函数和全局作用域
if(1){
var a = 100;
}
console.log(a);//100
闭包
一个函数的作用域是在其定义是的作用域,而不是在其执行时的作用域。
闭包的使用场景
- 函数作为返回值
- 函数作为参数传递
函数作为返回值
function Foo(){
var a = 100;
return function(){
console.log(a)
}
};
//Foo()返回一个函数,所以此时f1为一个函数;
var f1 = Foo();
var a = 200;
f1();
这时f1()//100 而不是200 两者毫无关系,f1它的父作用域为函数Foo,Foo中 a = 100,则f1中 a = 100;
函数作为参数传递
function foo(){
var a=100;
return function(){
console.log(a);
}
}
var f1=foo();//f1为函数
function f2(fn){
var a=200;
fn();
}
f2(f1);//100
通常遇到的问题
对变量提示的理解
console.log(a);//undefined
var a=100;
这里虽然一开始没有定义 变量a,但是在声明函数foo时,会将var a;提升;即在声明函数时,会将变量定义提前,
在js中,会将全局变量,函数声明提升;
foo();//100;
function foo(){
a=100;
console.log(a);//100
var a;
}
如何理解作用域
- 自由变量
- 作用域链,即如何寻找自由变量
- 必报的使用场景