Javascript上下文混淆

Javascript上下文混淆,javascript,Javascript,我有一个目标: var test = { setup: function() { property = 'hello!'; console.log(this); } }; 当我运行test.setup()时并打印出test.property()它给我未定义的。我明白这是因为我需要做这个.property,但我的问题是:为什么 通过console.log(this),我可以清楚地看到上下文是test对象,但由于某些原因,它不起作用 当JavaScript发现像property='hello'这

我有一个目标:

var test = {
 setup: function() { property = 'hello!'; console.log(this); }
};
当我运行
test.setup()时并打印出
test.property()它给我
未定义的
。我明白这是因为我需要做
这个.property
,但我的问题是:为什么

通过
console.log(this)
,我可以清楚地看到上下文是
test
对象,但由于某些原因,它不起作用


当JavaScript发现像
property='hello'这样的松散赋值时,谢谢你,它将创建一个全局变量(或在严格模式下引发错误)。所以,如果你想让它成为一个属性,你必须是显式的。

因为在这种情况下,
property='hello!'
window.property='hello!'相同
,而不是
this.property='hello!'


如果您分配给一个未声明的变量,它将创建一个全局变量。

当您使用“无变量”声明变量时,您将“意外”创建全局变量(附加到窗口对象),因此经验法则:始终在变量声明中使用“变量”。
使用此处的“var”,您将为设置函数创建局部变量。

属性也不是方法,因此应该是错误。
属性
不是测试对象的一部分。它是您分配给
设置
变量的函数的一部分,如果解除绑定,它将默认为全局的window.property。JavaScript不会以这种方式工作-
这个
从来都不是隐式的。@Pointy Ok,但是执行var test={hello:'hi!'没有这个功能,但在这种情况下它可以工作。这只是一个例外吗?这是一个完全不同的情况。好的,但是执行var test={hello:'hi!'}没有这个功能,但是在这种情况下它可以工作。这只是一个例外吗?好的,但是执行var test={hello:'hi!'}没有这个功能,但是在这种情况下它可以工作。这只是一个例外吗?@0xSina那个例子,
var test={hello:'hi!'}
,与您原始问题中的代码完全不同,它只是将一个由对象文字表达式构造的对象引用赋给变量。您最初的问题涉及函数中的变量名(“属性”)。