对象中的函数引用对象中的属性,不加this引用不到

发布于 2022-09-02 16:14:45 字数 465 浏览 19 评论 0

1.下面这种写法,在aa函数中可以取到t的值

var a = {
    t:3,
    aa: function(){
       alert(this.t);
    }
};
a.aa()  //3

2.但是下面这种写法就不行

var a = {
    t:3,
    aa: function(){
       alert(t);
    }
};
a.aa()  //找不到t

我理解在第二种写法上,aa中的this==a,那么在函数aa中作用链0中找不到t,应该会继续在aa的作用链继续向上找,会在a中找到t这个属性的啊?看样子程序在运行的时候没有向上找?
我的问题是:
为何a中的函数中引用a的对象,必须要加this? 不加为何引用不到?


明白了,其实第二种情况的t是window.t,而不是我之前理解的this.t

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

才能让你更想念 2022-09-09 16:14:45

你这里混淆了三个概念:属性查找(原型链),变量查找(作用域链)和this关键字

第一种情况a.aa()为什么能打印3。这里是this关键字和属性查找问题。this指代调用该函数(aa)的对象,即a,而a对象又是有t属性的,并且值为3,所以打印出3。

第二种情况a.aa()中的alert(t)为什么找不到t。这里是变量查找,和this和原型链没有半毛钱关系,因此不可能涉及到a的t属性的问题。那么问什么a.aa()种找不到t变量,请看这个函数的作用域:

  1. 函数本身的参数,无

  2. 函数内部定义的局部变量,无

  3. 函数所在作用域下(全局作用域)下是否有定义t变量,也无

那就肯定找不到t了呀

微凉 2022-09-09 16:14:45

因为字面量
var a = {

t : 3,
aa : function () {
    alert(this.t);
},

};
相当于
var a = new Object() {};
a.t = 3;
a.aa = function () {

alert(this.t);

};
这里的t指的就是a;而alert(t)里面的t它会默认为是全局的window.t,window可以省略,所以结果就是undefined了。

攒一口袋星星 2022-09-09 16:14:45

this是在函数执行时,产生的,包含在活动对象中,指向当前函数的执行环境,你在函数中没有用this.t,当然不能指向当前的执行环境,如果全局环境中有t标识符,则会访问window.t;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文