用';这';在javascript中

用';这';在javascript中,javascript,object,Javascript,Object,假设我有两个对象,比如 var a = { b: 1, c: this.b }; 及 把这两个像 console.log(a.c)//results undefined console.log(funcObj.c()) //results 1 为什么第一个函数不能使用this属性,而第二个函数可以? 我真的很困惑。答案取决于在每个上下文中所指的内容。在JavaScript中,这个绑定到调用当前函数时点(.)左边的任何对象。如果我们不在函数中,事情会变得更复杂--此是全局窗口对

假设我有两个对象,比如

var a = {
    b: 1,
    c: this.b
};

把这两个像

console.log(a.c)//results undefined
console.log(funcObj.c()) //results 1
为什么第一个函数不能使用this属性,而第二个函数可以?
我真的很困惑。

答案取决于
在每个上下文中所指的内容。在JavaScript中,
这个
绑定到调用当前函数时点(.)左边的任何对象。如果我们不在函数中,事情会变得更复杂--
是全局
窗口
对象或
未定义
,具体取决于环境

在第一个示例中,
this
的值取决于周围的上下文。当JavaScript构建对象
a
时,它会计算
this.b
。此
当前绑定到的任何对象都没有
b
属性,因此
c
属性设置为
未定义

在第二个示例中,当调用
funcObj.c()
时,函数中的
this
将绑定到
funcObj
。因此,当您请求
b
属性时,您会得到上面定义的
b
。事实上,
funcObj.b
是一个函数并不重要。以下措施也同样有效:

var funcObj = {
    b :  1,
    c: function() {
       console.log(return this.b)
    }
}

不能将声明中的其他属性作为Javascript文字声明的一部分引用。因此,在Javascript文字声明中:

var a = {
    b: 1,
    c: this.b
};
未设置为您想要的,并且
a
尚未初始化,因此您也无法引用它。在进行文字声明时,根本无法访问其他属性。这是当前Javascript规范的一个限制。您可以这样做:

var a = {
    b: 1
};
a.c = a.b;
因为
a
在该点完全成形,所以您可以引用其中的其他属性


或者,在现代浏览器中,您甚至可以使用getter获得像这样的
b
的“实时”版本(这与您所要求的功能并不完全相同,因为它是
b
的“实时”版本,可以跟踪其值),但它向您展示了另一种可能性:

var a = {
    b: 1,
    get c() {
         return b;
    }
};

console.log(a.c); //results 1

在第二个示例中:

var funcObj = {
    b : function() {
        return 1;
    },
    c: function() {
       console.log(return this.b())
    }
}

console.log(funcObj.c()) //results 1
您正在调用
funcObj.c()
,这会将
c
内部的
this
的值设置为
funcObj
,因此您可以通过
this
引用其他属性



这里的主要区别在于,
this
未设置为Javascript文字定义(第一个示例)中的对象,但是
this
在调用
funcObj.c()

中的方法时设置为对象,因为第一个示例显示了对象文字,没有函数作用域。我想你的意思是写
a.c=a.b在第二个示例中。@ChrisBouchard-yes。现在修好了。
var funcObj = {
    b : function() {
        return 1;
    },
    c: function() {
       console.log(return this.b())
    }
}

console.log(funcObj.c()) //results 1