注意:每一次测试都要刷新控制台后进行
1. this 与 立即执行函数
var obj = {
number: 3,
w:dd=99,
xxx: (function () {
console.log(this + '-----------')//立即执行函数中的this指向window,因为立即执行函数是window调用的
console.log(dd+'^^^^^^^^^^^')// 99
console.log(number+'***************')// 会报错:number is not defined,后面的代码就不会执行了
console.log(this.number + '~~~~~~~~~~~')//删除上面一行,此处this.number返回undefined
this.number += 4;// 值为NaN(undefined+4返回NaN)
return function () {
console.log(this.number + '】】】】】】】】')
this.number += 7;
console.log(this + '++++++++++++++++++++++')
}
})()//立即执行函数
}
obj.xxx() //相当于obj.xxx.call(),所以此处的this指向obj
console.log(obj.number) //10
程序未执行到obj.xxx()的时候,iife就已经执行了,而此!()() 可以理解为 !().call(),所以此处的this为undefined,根据浏览器的规定,this为undefined或者null时,那么默认转为window对象,所以
console.log(this + '-----------')
打印出来的是window对象。
iife执行完后返回一个对象。obj.xxx()相当于obj.xxx.call(),此处的this指向obj,所以iife返回的对象中的this为obj,也就是obj.xxx.call()调用的时候this为obj,obj的number为3,再+7,打印出10
2. this
示例1
<script>
function X() {
return object = {
name: 'object',
f1(x) {
console.log('^^^^^^^^^')
console.log(x)//此处的x为options
console.log(this)
console.log('^^^^^^^^^')
console.log('】】】】】】】')
console.log(x.f2())//会调用B,打印出options
console.log('】】】】】】】')
x.f2()
},
f2() {
console.log('~~~~~~~~~~~~')
console.log(this)
console.log('~~~~~~~~~~~~')
}
}
}
var options = {
name: 'options',
f1() { },
f2() {
console.log('%%%%%%%%%%%%%%%%%%')
console.log(this) // B
console.log('%%%%%%%%%%%%%%%%%%')
}
}
var x = X()
x.f1(options)//可以写为: x.f1.call(x,options)
</script>
示例2
<script>
function X() {
return object = {
name: 'object',
f1(x) {
x.f2.call(this)
// 这里的this是object,
// 因为call这个this,所以options中的this被指定成了object,
// 所以options中的this变为了object
},
f2() {
console.log(this)
}
}
}
var options = {
name: 'options',
f1() { },
f2() {
console.log('%%%%%%%%%%%%%%%%%%')
console.log(this)
console.log('%%%%%%%%%%%%%%%%%%')
}
}
var x = X()
x.f1(options)//可以写为: x.f1.call(x,options)
</script>
示例3
<script>
function X() {
return object = {
name: 'object',
options:null,
f1(x) {
console.log(111111111)
console.log(this)
console.log(111111111)
this.options = x
console.log(22222222)
console.log(this)
console.log(222222222)
this.f2()
},
f2() {
console.log(3333333333)
console.log(this)
console.log(3333333333)
console.log(444444444444444)
console.log(this.options)
console.log(444444444444444)
this.options.f2.call(this)
//this.options 是 options,因为this.options=x 这句话。
//options.f2.call(this),这里的this是object,因为call这个this,
//所以options中的this被指定成了object,
//所以options中的this变为了object
console.log(5555555555555)
console.log(this)
console.log(5555555555555)
}
}
}
var options = {
name: 'options',
f1() { },
f2() {
console.log('%%%%%%%%%%%%%%%%%%')
console.log(this)
console.log('%%%%%%%%%%%%%%%%%%')
}
}
var x = X()
x.f1(options)//可以写为: x.f1.call(x,options)
</script>
网友评论