Javascript 函数中的局部变量
我知道变量是其他对象的属性。例如:Javascript 函数中的局部变量,javascript,Javascript,我知道变量是其他对象的属性。例如: var myVar = 'something'; 是窗口对象的属性(当然,如果它在全局范围内) 如果我想找到变量的对象,我只需要使用this变量。但是: function f() { var myVar2 = 'something'; } myVar2属于哪个对象?(myVar属于窗口对象,但是myVar2呢?) 我想知道,谢谢。它不属于任何对象。它属于函数f的范围。您可以通过在f中执行myVar来访问它。您不能在f之外访问它 如果是的话 func
var myVar = 'something';
是窗口对象的属性(当然,如果它在全局范围内)
如果我想找到变量的对象,我只需要使用this变量。但是:
function f() {
var myVar2 = 'something';
}
myVar2属于哪个对象?(myVar属于窗口对象,但是myVar2呢?)
我想知道,谢谢。它不属于任何对象。它属于函数
f
的范围。您可以通过在f
中执行myVar
来访问它。您不能在f
之外访问它
如果是的话
function f() {
this.myVar = 1;
}
现在你可以做了
var myF = new f();
myF.myVar
实际上,用户定义的对象有时就是这样定义的。
myVar2
属于局部范围(属于f
),而myVar
属于全局范围。var
做了一些有趣的事情<代码>风险值语句被提升到其功能范围的顶部。var
的功能范围是它所处的任何函数
JavaScript没有块级作用域,这意味着:
(function () { //a closure to create new scope
var foo;
foo = 1;
if (condition) {
var bar;
bar = 3;
}
}());
…相当于
(function () {
var foo,
bar;
foo = 1;
if (condition) {
bar = 3;
}
}());
如果var
语句没有父级,它会将变量作为属性添加到全局上下文中,而在web浏览器中,全局上下文恰好是window
这是唯一一次使用var
创建属性。如果要创建对象的属性,只需设置它:
(function () {
var foo;
foo = {};
foo.bar = 'baz'; //this creates the `bar` property on `foo`
}());
JavaScript是一种具有原型继承的原型语言。函数是一流的对象(因为JavaScript并不反对函数)。这意味着函数可以像任何其他对象一样使用
您可以设置它们:
(function () {
var foo;
//foo is now a function
foo = function () {
alert('Hello World');
};
}());
您可以设置它们的属性:
(function () {
var foo;
foo = function () {
alert('Hello World');
};
foo.bar = 'baz'; //this works just fine
}());
您甚至可以将其作为参数传递:
(function () {
var foo,
bar;
foo = function () {
alert('Hello World');
};
bar = function (c) {
c();
};
bar(foo); //guess what this does?
}());
函数做的另一件很酷的事情是,它们充当构造函数。所有函数本质上都是构造函数,只需使用new
关键字调用它们:
(function () {
var foo; //case sensitive
//it doesn't matter whether you use `function Foo`
//or `var Foo = function...`
function Foo() {
alert('Hello World');
}
foo = new Foo();
foo.bar = 'baz';
}());
使用构造函数的重要细节是,函数的上下文(this
)将设置为构造函数创建的对象。这意味着您可以在构造函数中设置对象的属性:
(function () {
var foo;
function Foo() {
this.bar = 'baz';
}
foo = new Foo();
alert(foo.bar); //'baz'
}());
“我知道变量是其他对象的属性”-这是不正确的。很好的答案:,你可能对此感兴趣,但根据这一点:一切都是对象的属性。据一些人说,{}也被称为json对象。你应该在你的问题中链接该站点。不,那篇文章的作者是错的。是的,在他的评论中,一些人在反击,事实上,我们是否应该妥协:考虑到JS闭包的工作方式,您可以将局部函数变量描述为类似于为每次函数调用创建的闭包的属性,但是这个“对象”不是您可以从代码中访问的对象。我认为OP想要了解的不是提升和一流功能:-|