有一次我发现在将属性作为参数传递给其他函数之前将属性分配给函数很有用。
看起来像这样(抱歉匿名函数和变量赋值函数对象之间的任何混淆,我认为它们不是一回事):
"(could strict mode have something to do with this?)"
var funcOne = function(arg1, arg2) { return arg1 + arg2; };
funcOne.process = true;
var funcTwo = function(arg1, arg2) { return arg1 + arg2; };
funcTwo.process = false;
var procFunc = function(argFunc) {
if (argFunc.process) {
return argFunc(1,2);
}
return "not processed"
}
procFunc(funcOne); // 3
procFunc(funcTwo); // "not processed"
我想声明一个匿名函数并同时为其分配属性,这样当它稍后作为函数数组堆栈的一部分被调用时,条件代码可以依赖于该属性。
类似于:
"(could strict mode have something to do with this?)"
var funcOne = function(arg1, arg2) { return arg1 + arg2; }.process = true;
var funcTwo = function(arg1, arg2) { return arg1 + arg2; }.process = false;
var procFunc = function(argFunc) {
if (argFunc.process) {
return argFunc(1,2);
}
return "not processed"
}
procFunc(funcOne); // "not processed"
procFunc(funcTwo); // "not processed"
意外的“未处理”是因为令人困惑,JavaScript 实际上是将值“true”和“false”分配给 funcOne 和 Two 变量,并且当条件 if (argFunc .process)
被评估(不管,正如我所期望的,“严格模式”)。
我已经使用 IIFE 将“匿名”函数分配给变量然后分配该变量的属性并从 IIFE 返回该变量,但我希望有一个 JavaScript 语法用于也许这是一种更好的方法。
根据我的感觉,我尝试的点属性分配没有意义。如果程序员想为匿名函数分配多个属性怎么办?
var funcOne = function (arg1, arg2) { return arg1 + arg2; 我有一个短暂的希望} = { process: true };
但会抛出 SyntaxError: Invalid left-hand side in assignment
。
最佳答案
要创建函数,您有两种选择:
- 函数声明
有了这个,不涉及表达式:
function funcOne(...) {
}
除了作为单独的独立语句外,没有办法添加类似 funcOne.process = true
的内容。 (这并不是一件坏事——我实际上更喜欢这样的第二个陈述,它可能是最容易阅读的)
- 函数表达式
有了这个,你就有了一个可以分配给变量名的函数表达式 - 但你不能同时分配给变量名和给函数分配一个属性 =
,因为 =
(赋值运算符)解析为分配的值,无论左边是什么东西=
。这就是以下内容不起作用的原因:
var funcOne = function x(arg1, arg2) { return arg1 + arg2; }.process = true;
上面,分配的值是 true
,所以 funcOne
接收到的值是 true
(不保留对函数的引用) .
但是,您可以使用 Object.assign
,它解析为 第一个 参数,即被分配给的对象,将函数的声明和附加的您想要在一个简单的语句中分配给函数对象的属性:
var funcOne = Object.assign(
(arg1, arg2) => { return arg1 + arg2; },
{ process: true }
);
console.log(funcOne(3, 4));
关于javascript - 是否可以用属性声明一个匿名的非 IIFE JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63603100/