在javascript中

时间:2018-02-01 07:34:16

标签: javascript

我问这个,这有点令人困惑...... 将在控制台上打印什么。

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对象? 感谢

2 个答案:

答案 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)