this的值到底是什么
var obj = {
foo: function(){
console.log(this)
}
}
var bar = obj.foo
obj.foo() // 打印出的this是obj
bar() //打印出的this是window
想一下为什么它们的值不一样
JS(ES5)有三种函数调用方式:
function(p1, p2)
obj.child.method(p1, p2)
fn.call(context, p1, p2)
将.call作为调用方式,可改写成
function.call(undefined, p1, p2) // this是window
obj.child.method.call(obj.child, p1, p2) // this是obj.child
fn.call(context, p1, p2) // this是context
第一个原本是undefined,后因浏览器的规则变成window
浏览器的规则:如果传入的context是null 或 undefined,那么window对象就是默认的context(严格模式下context为undefined)
- this就是call一个函数时,传入的第一个参数
- 假若函数不是call形式调用,将它转换成.call()
this 关键字是为了在JS中加入动态作用域而作的努力。所谓动态作用域,就是说变量的作用范围,是根据函数调用的位置而定的。