从函数体内访问函数对象的属性
Accessing function object's properties from inside the function body
javascript 中的函数也是一个对象,可以有属性。那么有什么方法可以从它自己的函数体内访问它的属性吗?
像这样
var f = function() {
console.log(/*some way to access f.a*/);
};
f.a = 'Test';
f(); //should log 'Test' to console
你可以使用这个:
console.log(f.a);
如果 f
被执行,f()
,在 f.a = 'Test';
之前,您将在控制台中得到 undefined
,因为没有任何 属性 name/key a
进行定义。 f.a = 'Test';
执行后,name/keya
会定义在f上,对应的值为'Test'
。因此,稍后在函数 f
上执行时,值 'Test'
将是控制台的输出。
Prototypes
就是您要找的。
var F = function() {
console.log(this.a);
}
F.prototype.a = 'Test';
// instantiate new Object of class F
new F();
希望对您有所帮助!
这样做的经典方法是将函数绑定到自身,之后它可以通过 this
:
访问自己的属性
var f = function() {
console.log(this.a); // USE "THIS" TO ACCESS PROPERTY
};
f.a = 'Test';
f = f.bind(f); // BIND TO SELF
f(); // WILL LOG 'Test' TO CONSOLE
您可以使用 IIFE 进行设置:
var f = (function () {
function f () {
console.log(f.a);
}
f.a = 'Test';
return f;
})();
f() // logs 'Test'
f.a === 'Test' // true
请注意,您不必使用 f
(甚至函数声明)也能正常工作:
var f = (function () {
var _f = function () {
console.log(_f.a);
};
_f.a = 'Test'
return _f;
});
f() // logs 'Test'
f.a === 'Test' // true
有些人喜欢自始至终使用同一个变量来强调内层f
最终会变成外层f
,而有些人则喜欢区分每个作用域。哪种方式都可以。
arguments.callee
是函数本身,不受函数名称的影响。
var f = function() {
console.log(arguments.callee.a);
};
f.a = 'Test';
f();
下面是如何实现静态变量,将函数本身用作对象:
function f()
{
if (!f.staticObj)
f.staticObj={a:3};
return f.staticObj;
} // f
console.log(f().a); // Assigns the var
console.log(f().a); // Returns the var
您可以使用 JavaScript 闭包;
https://www.w3schools.com/js/js_function_closures.asp
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
javascript 中的函数也是一个对象,可以有属性。那么有什么方法可以从它自己的函数体内访问它的属性吗?
像这样
var f = function() {
console.log(/*some way to access f.a*/);
};
f.a = 'Test';
f(); //should log 'Test' to console
你可以使用这个:
console.log(f.a);
如果 f
被执行,f()
,在 f.a = 'Test';
之前,您将在控制台中得到 undefined
,因为没有任何 属性 name/key a
进行定义。 f.a = 'Test';
执行后,name/keya
会定义在f上,对应的值为'Test'
。因此,稍后在函数 f
上执行时,值 'Test'
将是控制台的输出。
Prototypes
就是您要找的。
var F = function() {
console.log(this.a);
}
F.prototype.a = 'Test';
// instantiate new Object of class F
new F();
希望对您有所帮助!
这样做的经典方法是将函数绑定到自身,之后它可以通过 this
:
var f = function() {
console.log(this.a); // USE "THIS" TO ACCESS PROPERTY
};
f.a = 'Test';
f = f.bind(f); // BIND TO SELF
f(); // WILL LOG 'Test' TO CONSOLE
您可以使用 IIFE 进行设置:
var f = (function () {
function f () {
console.log(f.a);
}
f.a = 'Test';
return f;
})();
f() // logs 'Test'
f.a === 'Test' // true
请注意,您不必使用 f
(甚至函数声明)也能正常工作:
var f = (function () {
var _f = function () {
console.log(_f.a);
};
_f.a = 'Test'
return _f;
});
f() // logs 'Test'
f.a === 'Test' // true
有些人喜欢自始至终使用同一个变量来强调内层f
最终会变成外层f
,而有些人则喜欢区分每个作用域。哪种方式都可以。
arguments.callee
是函数本身,不受函数名称的影响。
var f = function() {
console.log(arguments.callee.a);
};
f.a = 'Test';
f();
下面是如何实现静态变量,将函数本身用作对象:
function f()
{
if (!f.staticObj)
f.staticObj={a:3};
return f.staticObj;
} // f
console.log(f().a); // Assigns the var
console.log(f().a); // Returns the var
您可以使用 JavaScript 闭包;
https://www.w3schools.com/js/js_function_closures.asp
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();