Javascript 理解变量的创建

Javascript 理解变量的创建,javascript,Javascript,但当我使用变量并调用函数时: var counter = { count: 0, inc: function(){ this.count++; } } counter.inc(); count; //reference error: count is not defined 我的问题是,如果不使用变量并调用函数,为什么不创建count变量 var counter = { count: 0, inc: function(){ this.c

但当我使用变量并调用函数时:

var counter = {
   count: 0,
   inc: function(){
       this.count++;
   }
}
counter.inc();
count;
//reference error: count is not defined
我的问题是,如果不使用变量并调用函数,为什么不创建count变量

var counter = {
   count: 0,
   inc: function(){
       this.count++;
   }
}
var func = counter.inc;
func();
count;
// returns NaN Because func() runs window.count++

我的关键问题是:

为什么counter.inc()和var func=counter.inc不同;func()

初步:

当表达式:

+----------------------------------------------------------------+
|  counter.inc()   not equal to window.count++                   |
|  but func() equal to window.count++                            |
|                                                                |
+-------Why?-----------------------------------------------------+
window.count++;
计算后,该对象将引用全局(浏览器中的窗口)对象,因此它实际上是:

this.count++;
这引用全局对象的原因将在对其他问题的回答中解释

我的问题是,如果不使用变量并调用函数,为什么不创建count变量

它将count创建为全局对象的一个属性,这与使用变量语句(即
var count
)非常相似,但在其他地方解释了细微的差异

计算表达式时:

+----------------------------------------------------------------+
|  counter.inc()   not equal to window.count++                   |
|  but func() equal to window.count++                            |
|                                                                |
+-------Why?-----------------------------------------------------+
window.count++;
首先解析window.count。因为窗口没有count属性,所以它返回undefined。然后,运算符导致计算(未定义),返回NaN。然后,它尝试根据运算符的规则将1添加到NaN,这将返回NaN

然后它将调用,由于window.count不存在,它将创建它并分配值NaN

编辑 当您将函数调用为:

window.count++
那么这个函数中的对象就是计数器对象,所以:

counter.inc();
递增其count属性的值

当您这样做时:

this.count++;
那么函数中的这个值不是由调用设置的,所以它默认为全局对象。上面告诉您为什么会将window.count设置为NaN,当对其应用ToNumber时,其值解析为NaN的任何属性或变量都会出现这种情况

如果要在调用func之前创建全局计数变量并将其初始化为数值(例如
0
):


然后调用func将导致其值递增。

当您将存储在
counter.inc
中的匿名函数存储在
func
中时,它的默认上下文变为
窗口
。然后,当调用
func
时,由于没有在上下文中传递,因此上下文默认为
window
,它没有count属性<代码>窗口.count++导致
窗口.count
被设置为
NaN
,因为
窗口.count
未定义

var count = 0;
func();

因为count是作为分配给counter的对象的属性创建的,所以它不是全局变量。调用func时,调用inc函数时没有设置此项,因此它默认为全局(浏览器中的窗口)对象,
this.count++
解析为
window.count++
,并且由于没有window.count属性,访问它会返回未定义的值,而
++
运算符不能增加该值。请您在回答中验证您到底想说什么?但为什么它不同于counter.inc()和var func=counter.inc;func()???因为您将函数引用存储在
func
var中。它是
this
现在是窗口,而不是
counter
,我不明白在给定两个答案和注释的情况下,您怎么会得不到这个。你不明白什么?它的值是由调用设置的,而不是由函数定义的位置或方式设置的。调用函数将其设置为窗口的原因是,调用该函数时未设置基引用(并且与(执行)上下文无关)。。。这让我都很困惑,你看,这是什么?它似乎模仿了我想表达的观点。函数定义在何处或如何定义并不重要,重要的是函数执行时存储在何处。它是否作为window的成员执行?会员?关于B?我们只是在术语上有所不同吗?我不是要返回NaN的值,而是使用存储变量和调用函数与直接调用函数而不将其存储在变量中之间的区别。不,如果我使用counter.inc(),则表明未定义错误计数。但如果您说它是递增的,请在不使用return的情况下尝试一次。这是我不理解的部分。因为返回值是不相关的,所以不需要返回语句。有趣的是调用函数时,函数中为其分配了什么值,因为这是将解析count属性的对象,并且将尝试使用
++
运算符对其进行递增。如果使用
counter.inc()
将其设置为counter,则counter.count将递增。如果未设置此值,如在
func()
中,则不会设置此值,因此它默认为全局对象,因此
++
运算符会增加
窗口的计数。