JavaScript – this
做题:
var obj = { foo: function(){ console.log(this) } } var bar = obj.foo obj.foo() // 打印出的 this 是 obj bar() // 打印出的 this 是 window
JS(ES5)里面有三种函数调用形式:
func(p1, p2) obj.child.method(p1, p2) func.call(context, p1, p2)
第三种调用形式,才是正常调用形式:
func.call(context, p1, p2)
其他两种都是语法糖,可以等价地变为 call 形式:
func(p1, p2) 等价于 func.call(undefined, p1, p2) obj.child.method(p1, p2) 等价于 obj.child.method.call(obj.child, p1, p2)
函数调用只有一种形式:
func.call(context, p1, p2)
this,就是上面代码中的 context。
当写下面代码时
function func(){ console.log(this) } func()
等价于
function func(){ console.log(this) } func.call(undefined) // 可以简写为 func.call()
按理说打印出来的 this 应该就是 undefined 了吧,但是浏览器里有一条规则:
如果传的 context 是 null 或者 undefined,那么 window 对象就是默认的 context(严格模式下默认 context 是 undefined)
因此上面的打印结果是 window。