对象中的成员被称为对象属性,若成员是函数的话则称为对象的方法,
在script标签里的所有变量都是window对象的成员,window对象的成员包括script里的所有,当我们调用函数时写的是函数名()实际上是window.函数名() var i=2等价于var window.i=2
this锁定规则:任何函数运行时一定会有一个对象在调用它,那么是谁让这个函数运行的,那这个函数里面的关键字this就是调用该函数的对象。
例1
<script>
var name = '111'
var person = {
name: '222',
sayName: function () {
console.log(this.name)
}
}
function sayName () {
var sss = person.sayName;//将person.sayName赋值给sss
sss();// 指向window,thiname=111
person.sayName(); //指向person,this.name=222
(person.sayName)(); //指向person,this.name=222,带不带小括号没区别
(b = person.sayName)() //指向window, 111。等价于var b=person.sayName;b()
}
sayName()//指向window,调用函数
</script>
执行步骤:声明全局变量name、对象person、函数sayName、调用函数sayName(此时该函数的this指向window)
(1)将person.sayName赋给了变量sss,调用sss函数(此时sss函数指向window,所以,当person.sayName中有this变量时,就指向window中的变量),因此第一次打印了111
(2)pereson.sayName()调用函数sayName,此时是person调用了它,所以当sayName函数中有this关键字的话就到person对象中取找,因此,第二次打印了222
(3)这次调用它阿还是person,加不加括号是一样的,所以结果为222
(4)(b = person.sayName)()等价于var b=person.sayName();b(),所以此时调用b函数的对象是window,因此等下this去全局中寻找,所以第四次打印111
例2
<script>
var person = {
age: 18,
getAge: function() {
return this.age;
}
};
var getAge = person.getAge
console.log(getAge())//指向window
</script>
分析步骤:(1)声明对象person、声明getAge并将person.Age函数赋给getAge
开始调用getAge并打印,此时调用getAge的对象是window(console.log(getAge()等价于:先调用getAge()函数,再将其打印出来),所以对象person中的getAge函数中的this是指向window,所以返回的是window中的age==20
上面两个例题用一句话来总结:this不看它是在哪个函数或对象中,而是看this所处的函数@1是谁调用@2这个函数@1的,谁调用了这个函数@1,this就是哪个对象@2
@1标注的是this所在的那个函数
下面是常见的 this所处的函数调用其函数的对象
<script>
obj.fn()//obj
fn()//window
arr[]()//window
obj.x.y()//obj.x
(函数)()//window
fn()()//window
fn()()()//window
fn()[]()//fn()返回的数组
fn()[]()()//window
//看不出来了,大多是指向window(谨慎思考)
</script>