js中的this

JS中this的解析
本文详细解释了JavaScript中this关键字的含义及用法,包括在不同上下文中this的指向变化,以及如何通过call和apply方法改变this的指向。

JS中的this是一个对象.它的值不确定,也不能确定.因为他是一个动态的,只会在代码执行的时候在能确定.

目前,this出现的位置有两种即function内部和function外部

1.它在function的外部 

没有function关键字把它包起来。

它的值固定是: window 

例如 console.log(this) 值就是window

2.    在function内部又分四种情况:

a)     当这个function不是对象里的属性,而仅是一个被调用的函数的时候,当调用的时候,这个this就是window

b)     当这个函数是对象里的属性时候我们通过   对象.方法   调用时,this就是这个对象.

c)     在调用函数之前加new 会创建一个新的对象.这时的函数被当作了构造器.函数内部的this指向的是创建的这个对象

function f(){
this.name = '张三'
}
var a = new f();
console.log(a)  
他的结果是  f{name:’张三’}

前面加new  this指向new出来的对象.所以a.name的值为‘’张三‘’

d)     当this出现在事件的响应函数中的时候,this指向这个对象即

对象.onclick = function(){
       This出现在这里this指向的是对象
}

个人总结:谁调这个函数,这个函数里的this就指向谁,找不到谁调用,指向window 也就是说window调用了他

var name ='李四';
function say(){
    console.log(this.name)
}
function eat(){
    console.log(this.name)
}
var a = {
    name:'张三',
    say:say,
    eat:eat()
}
a.say();  //输出的是'李四'
a.eat;      //输出的是'张三'
         如果对象内部的属性值为函数且是调用的或者立即执行的如上面的eat(),则相当于直接执行该函数,所以访问该属性的时候值为函数执行的结果,而如果是函数,且不执行,则在访问该属性的时候,该属性的值为函数,如果再在其后加括号则变成了调用该函数,此时为上下文结果

或者理解为:

假设一个属性,其属性值为函数 ,当我们在通过 对象.属性   的时候,就是访问该属性的值, 

而该属性值,又有两种:

一种是为未执行即未调用的函数, ,未执行的函数,属性值就是该函数

一种是执行即调用的函数,执行的函数,属性值就是执行的结果.

所以,如果对象.属性后面加括号,其属性值一定是个函数,其结果就是执行这个函数后的结果,而执行这个函数要根据上下文判断.


那么怎么修改this的值呢

修改this值

修改this的值,我们是是通过apply和call来动态修改的

首先来call()这个格式

函数f . call (newObj ,参数一,参数二……)

形参:

newObj: 是用newObj替换函数f中的this

参数一……: 函数f的参数

 

调用函数

 

函数正常调用

函数f (参1,参2.......)

函数内部的this就是window

加call

函数f.call(newObj,参1,参2.......)

也会运行函数f内部的代码,但它会把

函数内部的this改成newObj

再来看apply格式:

函数f . apply ( newObj,[参数1,参数2.....])

形参:

  newObj          :用newObj替换函数f中的this

   参数1...参数n : 函数f的参数

 

调用函数

 

函数正常调用

函数f (参1,参2.......)

函数内部的this就是window

加apply

函数f.apply(newObj,[参1,参2.......])

也会运行函数f内部的代码,但它会把

函数内部的this改成newObj

所以:当函数f没有形参,f.call(newObj) 与 f.apply(newObj)是等价的

PS:我们自己定义的函数也可以使用call和apply因为他们都是Function.prototype的原型属性

那么,什么时候使用这个this呢,当我们把函数借给一个对象去使用一下的时候.

 

call中obj1本来是要传给this的,但代码中没有this所以这个obj1传进去也没有用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值