函数引用其属性是否合法 javascript (ECMAScript)?
Is it legal javascript (ECMAScript) for a function to reference its attributes?
函数引用其属性是否合法 javascript (ECMAScript-5)?
var baz = function(callback) {
return callback();
};
var foo = function() {
return foo.bar;
}
foo.bar = 1;
foo(); // 1?
baz(foo); // 1?
编辑:您能否向我介绍 ECMA 规范中声明这是合法的部分?
是的,一个函数就是一个对象,对象有属性并且它们可以访问它们的属性。
请记住,在 JS 函数中首先是 class 公民,它们可以拥有自己的属性。还请记住,属性 评估发生在 调用函数时 而不是在创建函数时,因此 属性 可以稍后添加。
你可以在这里看到:
var foo = function() {
return foo.bar;
}
foo.bar = 1;
alert(foo()); // 1?
是的。
人们在使用对象时经常 运行 遇到这个问题,这些对象在初始化期间被评估并且在尝试引用它们的属性时不存在。这不是函数的问题,因为 属性 在稍后调用该函数之前不会被访问。
例如:
let foo = {
bar: 1,
baz: foo.bar + 1
};
失败,因为尚未将对象分配给 foo
,因此 foo.bar
未定义。
对于函数,这不是问题,因为 foo
是对函数的引用,并且 bar
在函数被 调用之前不会被访问 :
function foo() {
return foo.bar + 1;
}
foo.bar = 1;
您可以使用更好的模式,例如:
var baz = function() {
var myVal = 0;
return function() {
//body
}
}()
这样你在闭包中就有了一种备忘录变量,它会为你保存值
函数是对象,所以当然,它们可以拥有属性并访问它们。请注意,函数体无法访问这些属性。
注意像这样的代码需要函数体知道它的名字:
function foo() {
return foo.bar;
}
.. 但你可以利用 arguments
属性 删除 redundancy/dependency:
function foo() {
return arguments.callee.bar;
}
foo.bar = 1;
foo(); // 1
函数引用其属性是否合法 javascript (ECMAScript-5)?
var baz = function(callback) {
return callback();
};
var foo = function() {
return foo.bar;
}
foo.bar = 1;
foo(); // 1?
baz(foo); // 1?
编辑:您能否向我介绍 ECMA 规范中声明这是合法的部分?
是的,一个函数就是一个对象,对象有属性并且它们可以访问它们的属性。
请记住,在 JS 函数中首先是 class 公民,它们可以拥有自己的属性。还请记住,属性 评估发生在 调用函数时 而不是在创建函数时,因此 属性 可以稍后添加。
你可以在这里看到:
var foo = function() {
return foo.bar;
}
foo.bar = 1;
alert(foo()); // 1?
是的。
人们在使用对象时经常 运行 遇到这个问题,这些对象在初始化期间被评估并且在尝试引用它们的属性时不存在。这不是函数的问题,因为 属性 在稍后调用该函数之前不会被访问。
例如:
let foo = {
bar: 1,
baz: foo.bar + 1
};
失败,因为尚未将对象分配给 foo
,因此 foo.bar
未定义。
对于函数,这不是问题,因为 foo
是对函数的引用,并且 bar
在函数被 调用之前不会被访问 :
function foo() {
return foo.bar + 1;
}
foo.bar = 1;
您可以使用更好的模式,例如:
var baz = function() {
var myVal = 0;
return function() {
//body
}
}()
这样你在闭包中就有了一种备忘录变量,它会为你保存值
函数是对象,所以当然,它们可以拥有属性并访问它们。请注意,函数体无法访问这些属性。
注意像这样的代码需要函数体知道它的名字:
function foo() {
return foo.bar;
}
.. 但你可以利用 arguments
属性 删除 redundancy/dependency:
function foo() {
return arguments.callee.bar;
}
foo.bar = 1;
foo(); // 1