function foo(){
console.log(this.a)
}
function doFoo(fn){
var a = "doFoo";
fn();
}
var obj = {
a:2,
foo:foo
};
var a = "global";
doFoo(obj.foo); //global
为什么输出的是global而不是doFoo?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这就是一个局部变量的问题,将问题往深处看,本质的调用如下所示:
输出也是global,因为变量没有进行传递,foo中只识别父级作用域和本作用域内的变量,调用者的变量是不识别的
fn()在调用的时候,
this会指向foo函数this会指向全局,this指向的是动态作用域,根据调用改变指向,而foo函数中没有变量a,所以在全局找this的指向是在调用时决定的,首先你声明了一个foo函数,并且将其作为obj的一个方法
,这里如果你调用obj.foo(),会得到2,这是this的一种隐士绑定,但是你采用的是将obj.foo作为参数传入doFoo函数,
这里,参数传递的效果相当于
var fn = obj.foo;这里的效果和直接将foo函数传入的效果是完全一样的。
最后说为什么,不输出doFoo,首先你在函数里定义了一个变量,这个a并不是doFoo的属性,所以不会弹出doFoo,其次fn(),
这中调用方式,与window.fn()完全一样,this是指向window的,这里我把他叫做默认绑定。所以,输出global
this指向的是window