js中this的指向、作用域和闭包

this指向问题

1、this在执行的时候才会确定指向的是什么,不执行无法确定。
this的几种不同的使用场景
  1. 构造函数
  2. 对象属性
  3. 普通函数
  4. 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


闭包

一个函数的作用域是在其定义是的作用域,而不是在其执行时的作用域。
闭包的使用场景
  1. 函数作为返回值
  2. 函数作为参数传递

函数作为返回值

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;
}
如何理解作用域
  1. 自由变量
  2. 作用域链,即如何寻找自由变量
  3. 必报的使用场景
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值