我问这个,这有点令人困惑...... 将在控制台上打印什么。
var a = {
b : {
foo : function(){
console.log(this);
}
}
}
a.b.foo();//in console : foo function
var b = a.b;
b.foo();//in console : foo function
var foo = a.b.foo;
foo();////in console : window
第一个很明显。 为什么第二个打印也是foo函数,第三个是window对象? 感谢
答案 0 :(得分:1)
在foo()
中,行console.log(this);
将记录该函数所属的对象。
您对前两个示例的console.log
结果略有误解。 console.log
没有记录foo()
,而是记录a.b
- 这是foo()
所属的对象。尝试将console.log(a.b);
添加到您的代码中,您会发现它会记录相同的结果。
在第三个示例中,记录了window
,因为window
是所有javascript对象的基本范围。它自动"附加"您定义的每个变量。
例如:
window.foo = 5;
与:
相同var foo = 5;
前两个示例在foo()
是另一个对象的子项时会调用window.foo
,因此$('.page').on('click',function(){
// do action
});
不存在。
答案 1 :(得分:0)
第二个使用对a.b
的引用,因此您仍然在{ a: {b} }
对象的上下文中执行,this
是对象。
在第三个中,您只是获得对函数本身的引用,附加到全局变量,因此在调用时没有子对象上下文。只有全局上下文(在浏览器控制台中为window
,但与其他javascript上下文不一致,如node.js)