是否可以使用属性删除匿名非IIFE JavaScript函数

是否可以使用属性删除匿名非IIFE JavaScript函数,javascript,function,properties,Javascript,Function,Properties,有一次,我发现在将属性作为参数传递给其他函数之前,为函数指定属性是很有用的 看起来是这样的(对于匿名函数和变量赋值函数对象之间的任何混淆,我感到抱歉,我认为它们不是一回事): 我想声明一个匿名函数,并同时为其分配属性,以便在以后将其作为函数数组堆栈的一部分调用时,条件代码可以依赖于该属性 比如: "(could strict mode have something to do with this?)" var funcOne = function(arg1, arg2) {

有一次,我发现在将属性作为参数传递给其他函数之前,为函数指定属性是很有用的

看起来是这样的(对于匿名函数和变量赋值函数对象之间的任何混淆,我感到抱歉,我认为它们不是一回事):

我想声明一个匿名函数,并同时为其分配属性,以便在以后将其作为函数数组堆栈的一部分调用时,条件代码可以依赖于该属性

比如:

"(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和两个变量,并且在计算条件
if(argFunc.process)
时(如我所料,无论“严格模式”)都不会引发错误

我已经使用IIFE实现了匿名功能,IIFE将“匿名”函数分配给一个变量,然后分配该变量的属性,并从IIFE中返回该变量,但我希望有一种JavaScript语法来实现这一点,或者只是一种更好的方式,也许

对我来说,我尝试的点属性分配没有意义。如果程序员想要为匿名函数分配多个属性,该怎么办


我对
var funcOne=function(arg1,arg2){return arg1+arg2;}={process:true}抱有短暂的希望
但在赋值中抛出一个
语法错误:左侧无效

要创建函数,您有两个选项:

  • 函数声明
在这种情况下,不涉及任何表达式:

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;},
{进程:true}
);

console.log(funcOne(3,4))功能组合是正确的域。。。下面是一个函数,用于将道具添加到其他函数

var addProp = function(fun, propName, propVal){fun[propName] = propVal; return fun}


var funcOne = addProp(function(arg1,arg2){ return arg1 + arg2; }, "process",true);
var funcTwo = addProp(function(arg1,arg2){ return arg1 + arg2; }, "process",false);

生成的代码如下所示。并按预期运行

另一种方法是使用辅助函数:

const addProp = (fn, value) => { fn.process = value; return fn; };

const myFunc = addProp((arg1, arg2) => arg1 + arg2, true);

console.log(myFunc.process); // => true
console.log(myFunc(1, 2));   // => 3
你也可以和一个装饰师一起做这件事,尽管那是一件需要透明处理的事情

const addProp = (fn, value) => { fn.process = value; return fn; };

const myFunc = addProp((arg1, arg2) => arg1 + arg2, true);

console.log(myFunc.process); // => true
console.log(myFunc(1, 2));   // => 3