this指向问题
https://github.com/mqyqingfeng/Blog/issues/7
this一般有几种调用场景
var obj = {a: 1, b: function(){console.log(this);}}
1、作为对象调用时,指向该对象 obj.b(); // 指向obj
2、作为函数调用, var b = obj.b; b(); // 指向全局window
3、作为构造函数调用 var b = new Fun(); // this指向当前实例对象
4、作为call与apply调用 obj.b.apply(object, []); // this指向当前的object
但是下面的几种情况只能从ECMAScript规范来解释this的指向:
概念:
MemberExpression:函数调用()前的部分
Reference:一种只存在于规范中的类型
获取 Reference 组成部分的方法:
GetValue:可以获取MemberExpression值的接口
GetBase:可以获取Reference this的值的接口
ECMAPScript规定:
= ,||, 逗号表达式如果在MemberExpression中出现,在获取this的时候都必须用GetValue,而此时
返回的类型不再是this,而是undenfined,只有用GetBase才能获取到MemberExpression的this。
最后总结如下:
如果在()前的函数调用中出现了= ,||, 逗号表达式,this值就会是undefined,在严格模式下会报错,非严格模式下指向window.
如下测试:
var value = 1;
var foo = {
value: 2,
bar: function () {
return this.value;
}
}
//示例1
console.log(foo.bar()); // 2
//示例2
console.log((foo.bar)()); // 2
//示例3
console.log((foo.bar = foo.bar)()); // 1
//示例4
console.log((false || foo.bar)()); // 1
//示例5
console.log((foo.bar, foo.bar)()); // 1
call和apply
闭包
zepto和闭包
网友评论