能否声明一个带有属性的匿名非IIFE JavaScript函数?

3

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

具体如下(关于匿名函数和变量分配的函数对象之间的任何混淆,我认为它们不是同一件事):

"(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
3个回答

4
创建函数有两种选项:
  • 函数声明
使用这个选项,不涉及表达式:
function funcOne(...) {
}

无法像 funcOne.process = true 这样添加内容,除非作为独立的语句。这并不是什么坏事——实际上我更喜欢这种二次声明,它可能更容易阅读。

  • 函数表达式

通过这个方法,您可以得到一个可以赋值给变量名的函数表达式,但是您不能使用 = 同时将属性分配给函数和变量名,因为 =(赋值运算符)解析为 被赋的值,而不考虑左侧是什么类型的东西。这就是为什么以下操作不起作用的原因:

var funcOne = function x(arg1, arg2) { return arg1 + arg2; }.process = true;

上面代码中被赋值的值为true,因此funcOne接收到的值为true(不再引用该函数)。

但是,您可以使用Object.assign将声明函数和要分配给该函数对象的附加属性合并在单个简洁语句中,Object.assign返回第一个参数即被分配的对象:

var funcOne = Object.assign(
  (arg1, arg2) => { return arg1 + arg2; },
  { process: true }
);
console.log(funcOne(3, 4));


0

函数组合是正确的方法... 这里有一个将属性添加到另一个函数的函数。

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);

生成的代码看起来是这样的,而且表现得符合预期。


0
另一种做法是使用一个辅助函数:
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

你可能也可以用一个装饰器来做这个,虽然那是ECMAScript未来版本的一个提案,需要转译才能工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接