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传进去也没有用