是否可以使用属性来代替匿名非IIFE JavaScript函数

问题描述

我曾经发现在将属性作为参数传递给其他函数之前,先将属性分配给函数很有用。

看起来像这样(很抱歉匿名函数和变量分配的函数对象之间有任何混淆,我认为它们不是同一回事):

"(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将'anonymous'函数分配给变量,然后将该变量分配给属性,然后将该变量从IIFE中返回,但是我希望可以使用JavaScript语法这种或只是一种更好的方法

就我的敏感性而言,我尝试过的dot属性分配没有任何意义。如果程序员想为匿名函数分配多个属性怎么办?

我对var funcOne = function (arg1,arg2) { return arg1 + arg2; } = { process: true };抱有短暂的希望,但这引发了SyntaxError: Invalid left-hand side in assignment

解决方法

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

  • 函数声明

与此无关,不涉及任何表达式:

function funcOne(...) {
}

除了作为单独的独立语句外,无法附加funcOne.process = true之类的内容。 (并不是那是一件坏事-我实际上更喜欢第二句话,这可能是最容易阅读的内容)

  • 函数表达式

有了这个,您就有了一个函数表达式可以分配给变量名-但不能分配给变量名 和{{ 1}},因为=(赋值运算符)解析为所赋的,而不管=左侧的东西是什么。这就是为什么以下内容不起作用的原因:

=

上面,分配的值是var funcOne = function x(arg1,arg2) { return arg1 + arg2; }.process = true; ,因此true收到的值是funcOne(不保留对该函数的引用)。

但是,您可以使用true(解析为分配给对象的 first 参数)来组合函数的声明和要分配的其他属性。在一个简洁的语句中访问函数对象:

Object.assign

,

功能组合是正确的选择...这是将道具添加到其他功能的功能。

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,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

您也可以使用装饰器来执行此操作,尽管那是a proposal for future versions of ECMASCript,并且需要进行翻译才能工作。