this基本上就代表的是对象 在及其少的时候 this不是对象=>call apply bind
1、
<script>
function fn(){
this.x=100 //等价于window.x=100
}
fn() //等价于window.fn(),全局函数看作为window的方法
console.log(x)//等价于console.log(window.x=100) 打印100
//易错点:容易把x看作函数内的变量,x的作用域在函数内,外部调用时无法获取,所以以为报错
</script>
2、
<script>
var obj={
name:"jack",
age:10,
setAge:function(age){ //函数的嵌套
this.age=age
}
}
obj.setAge(30) //obj为调用者,调用setAge方法,this.age=age等价于obj.age=age
//obj对象已经有age属性,所以修改age的值,变化后age=30
console.log(obj)//{name:"jack",age:30,setAge:function(age){this.age=age}}
var fn=obj.setAge //定义一个fn变量,fn引用setAge函数对象
fn(40)//此时的调用者为隐式的window,this.age=age等价于window.age=age
//window对象中无age,所以先创建age属性,再赋值为40
console.log(age) //40
</script>
3、
<script>
function fn(){}
function fm () {
this.fm=100
//等价于fn.fm=100
}
fn.fn=fm //为fn函数对象创建一个fn属性,引用fm函数对象
fn.fn()//让fm函数运行 而且调用者是fn函数(对象) 运行的函数内部的this是fn函数
console.log(fn.fn,fn.fm)// function fm () {this.fm=100},100
console.log(window.fm)//全局函数看成window对象的方法,
//打印为function fm () {this.fm=100}
</script>
4、
<script>
var obj = {
name: "karen",
fn: function() {
console.log(this.name) //window默认有name属性,但值为空,打印为空字符串
}
}
var a = obj.fn //定义一个变量a,引用obj对象中函数对象
a()//调用函数,调用者为隐式的window对象
//----------------------------------------------
//此题中为this可以不考虑谁调用,而是考虑函数作用域
var obj = {
name: "karen",
fn: function() {
console.log(name)
//fn函数中无name属性,它会到它的上一层寻找name属性
// 打印karen
}
}
var a = obj.fn
a()//调用函数
</script>