javascript - 关于this的问题
怪我咯
怪我咯 2017-04-11 09:23:29
[JavaScript讨论组]
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?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
迷茫

这就是一个局部变量的问题,将问题往深处看,本质的调用如下所示:

function foo(){
    console.log(this.a)
}
function doFoo(){
    var a = "doFoo";
    foo();
}
var a = "global";
doFoo();

输出也是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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号