1).
var test = (function(a){
this.a = a
console.log(a)
return function(b) {
return this.a + b
}
}(function(a, b){return a}(11, 45)))
test(7)
上面的代码我们可以看成是一个立即执行函数右侧函数调用的时候里面又有一个立即执行函数,所以我们可以从右往左先把最里层的立即执行函数执行完拿到值,然后再往外层走(最外层的立即执行函数(function(a, b){return a}(11, 45))
是对外层函数的调用,里层的立即执行函数(11, 45)
是对前面函数的调用传参)
第一步我们先根据
(11, 45)
来执行function(a, b){return a}
这个函数得到一个结果11
第二步把(function(a, b){return a}(11, 45))
换成(11)也就是
var test = (function(a){
this.a = a
console.log(a)
return function(b) {
return this.a + b
}
}(11)
第三步通过11执行
function(a){
this.a = a // 11
console.log(a)
return function(b) {
return this.a + b
}
}
得到
var test = function(b) {
return 11 + b
}
第四步执行test(7)得到18
2).
var test = (function() {
var that
var obj = function() {
this.name = 'name'
this.age = 22
that = this
}
obj.prototype = {
aaa: function(n) {
console.log(this === that)
console.log(this === test)
console.log(that === test)
},
bbb: function() {
this.aaa(3)
}
}
return new obj()
})()
test.bbb()
1.上面的代码test.bbb我们换成用call的方式调用也就是test.bbb.call(test)所以bbb里的this是test
- test返回一个实例对象,实例对象可以直接调用构造函数原型上的bbb,这个构造函数obj以及obj的原型里的this就是我们的实例对象,所以aaa和bbb里this就是实例对象,又因为bbb里的this是test,所以obj里的this也是test,然后把this赋值给that,所以that也全等于test
网友评论