如何解决是否可以使用属性来代替匿名非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,并且需要进行翻译才能工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。