【问题标题】:Calling a constructor function with parameters调用带参数的构造函数
【发布时间】:2019-10-11 17:16:40
【问题描述】:

我有一个无法修改的函数,我需要调用它,但我以前从未见过这样的东西。

var myCategorize = function(z) {
    return function(q) {
      return 1;
    }
 }('window'.indexOf('w') > 0 || window || false);

为了简化,我已经去掉了 function(q) 部分的一些代码。

我想我有一个柯里化函数,所以我尝试了这个:

let category = myCategorize(bookTitles[i])(categories);

但是当我这样做时,我收到以下错误:

Uncaught TypeError: myCategorize(...) is not a function

所以也许这是一个匿名构造函数,所以我尝试这样的事情:

let category = function(){myCategorize(bookTitles[i])(categories)};
console.log(category.apply());

我得到同样的错误。如何调用这个函数并得到返回值1?

【问题讨论】:

  • myCategorize 指的是作用域函数function(q) { return 1; },而不是外部函数。
  • 什么...'window'.indexOf('w') > 0 将始终解析为 false。
  • myCategorize(x) 将始终返回 1
  • 函数不是我写的,请看问题。我知道它总是会解析为 false 并且总是返回 1。为了简单起见,我删除了内部代码,因为我无权发布它。
  • @MattKuhns 您可能不会编写函数,但使用 745 rep 您应该知道它不是 minimal reproducible example 有这些噪音。

标签: javascript function ecmascript-6


【解决方案1】:

myCategorize 不是柯里化函数,它是实现模块模式的 IIFE。最后一行末尾的括号执行顶级function(z)

var myCategorize = function(z) {
    return function(q) {
      return 1;
    }
 }('window'.indexOf('w') > 0 || window || false);
//^--------------------------------------------^

并传入z 的值。如果我重写它以添加额外的括号和名称位会更清楚:

var myCategorize = (function outer(z) {
//start of outer --^
    return function inner(q) {
      return 1;
    }
 })('window'.indexOf('w') > 0 || window || false);
//^-- end of outer

所以你分配给myCategorize 的只是inner。要执行它,只需添加括号和一个参数:

var myCategorize = function(z) {
    return function(q) {
      return 1;
    }
 }('window'.indexOf('w') > 0 || window || false);

console.log("myCategorize", myCategorize);
var executionResult = myCategorize("foo");
console.log("executionResult", executionResult);

【讨论】:

  • 这行得通,感谢您指出模式 - IIFE 实现模块模式。
【解决方案2】:

加括号的时候已经调用了一次函数,所以myCategorize的值为:

ƒ (q) {
  return 1;
}

然后你用let category = myCategorize(bookTitles[i])调用那个函数,category的值是:1

所以,那么等价于let category = myCategorize(bookTitles[i])(categories);

let category = 1(categories); 抛出该错误

var myCategorize = function(z) {
  return function(q) {
    return 1;
  }
}('window'.indexOf('w') > 0 || window || false);

let category = myCategorize('x'); // 1

console.log(category);

let category2 = myCategorize('x')('y'); // throws, equovalent to 1('y');

【讨论】:

  • 谢谢,我试试看。
猜你喜欢
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多