Javascript 函数作用域中的名称是否不被视为属性?

Javascript 函数作用域中的名称是否不被视为属性?,javascript,Javascript,对于下面的代码 function Foo(value) { property = value alert('Hello ' + value); this.y = value; } Foo.prototype.x = 10; Foo.prototype.calculate = function (input) { console.log('calculated value: ' + input*2); } b = new Foo(20); c = new Foo(30);

对于下面的代码

function Foo(value) {
  property = value
  alert('Hello ' + value);
  this.y = value;
}

Foo.prototype.x = 10;

Foo.prototype.calculate = function (input) {
  console.log('calculated value: ' + input*2);
}

b = new Foo(20);
c = new Foo(30);
以下是我的理解,

但是,我希望name
property
和name
alert
作为属性,是
Foo
的一部分,如下所示

> Object.getOwnPropertyNames(Foo)
Array [ "prototype", "length", "name" ]

为什么
property
alert
不被视为
Foo
的属性?

要在对象上创建属性,必须明确引用该对象(就像使用
this.y=value;
一样)或在原型链上继承它

既然你没有这么做,它们就不是财产。它们是变量


由于没有使用
var
(或
let
,或任何其他限制范围的内容)声明,因此它们是全局变量。(如果使用(始终使用严格模式),则会出现错误)。

要在对象上创建属性,必须显式引用该对象(就像使用
this.y=value;
一样)或在原型链上继承该对象

既然你没有这么做,它们就不是财产。它们是变量


由于没有使用
var
(或
let
,或任何其他限制范围的内容)声明,因此它们是全局变量。(如果您正在使用(始终使用严格模式),则会出现错误)。

@overexchange-两者都有。这是一个变量。“有一个名字”是变量本质的一部分。变量的值是对变量的引用。所有函数都是对象。在
Foo.prototype
中,您会将
x
称为属性还是其他什么?因为它对于
Foo
的所有实例都是通用的。它是prototype对象的一个属性。它通过prototype链在所有Foo实例上作为属性提供(除非被屏蔽)。您使用
Foo.prototype
显式引用对象。因此,变量只是代码(函数)@overexchange执行的一部分-两者都是。这是一个变量。“有一个名字”是变量本质的一部分。变量的值是对变量的引用。所有函数都是对象。在
Foo.prototype
中,您会将
x
称为属性还是其他什么?因为它对于
Foo
的所有实例都是通用的。它是prototype对象的一个属性。它通过prototype链在所有Foo实例上作为属性提供(除非被屏蔽)。您使用
Foo.prototype
显式引用对象。因此,变量只是代码(函数)执行的一部分,
Foo
中未声明的
属性
将创建一个隐式全局变量。@Teemu If
属性
的作用域在该js文件(模块)中是全局的。
alert
的作用域是什么?
alert
在您的代码中调用一个全局函数,它是一个函数调用,它的作用域并不特定于任何地方。@Teemu 1)全局函数,您的意思是
window
作用域,
window['alert']
?2) 当您说隐式全局变量
x
时,您的意思是
window['x']
,如前所述?1)在某种程度上,是的,
alert
window
对象中系统定义的DOM属性。2) 链接的答案很好地描述了“隐式全局”。请注意,
Foo
中未声明的
property
会创建一个隐式全局变量。@Teemu If
property
的作用域在该js文件(模块)中是全局的。
alert
的作用域是什么?
alert
在您的代码中调用一个全局函数,它是一个函数调用,它的作用域并不特定于任何地方。@Teemu 1)全局函数,您的意思是
window
作用域,
window['alert']
?2) 当您说隐式全局变量
x
时,您的意思是
window['x']
,如前所述?1)在某种程度上,是的,
alert
window
对象中系统定义的DOM属性。2) 链接的答案很好地描述了“隐式全局”。