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);
以下是我的理解,
但是,我希望nameproperty
和namealert
作为属性,是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 Ifproperty
的作用域在该js文件(模块)中是全局的。alert
的作用域是什么?alert
在您的代码中调用一个全局函数,它是一个函数调用,它的作用域并不特定于任何地方。@Teemu 1)全局函数,您的意思是window
作用域,window['alert']
?2) 当您说隐式全局变量x
时,您的意思是window['x']
,如前所述?1)在某种程度上,是的,alert
是window
对象中系统定义的DOM属性。2) 链接的答案很好地描述了“隐式全局”。