Javascript:typeof表示“函数”,但它不能作为函数调用

2024-05-05

这次我对 Javascript 真的很困惑:

var x = Array.prototype.concat.call;
typeof x; // function
x(); // Uncaught TypeError: x is not a function

这里到底发生了什么?


如果有帮助的话,我还注意到:

  • x([1,2],[3,4])也不行

  • toString也认为它是一个函数:

    Object.prototype.toString.call(x); // "[object Function]"
    
  • 这也会发生在Array.prototype.concat.apply.

  • 当它被强制作为表达式时,它也不起作用:

    (0, Array.prototype.concat.call)([1,2],[3,4]); // Same TypeError
    

在 Chrome 和 Node.js 中进行了测试。


该错误具有误导性。 Xis一个函数,但它丢失了引用的函数(concat),这会引发错误

在 Firefox 上运行会出现更具描述性的错误

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Called_on_inknown_type https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Called_on_incompatible_type

它的意思是call函数没有任何绑定。 同样,如果你采用这样的对象:

const a = {
  b: 2,
  test() {
    console.log('hi', this.b);
  }
};
const c = a.test;
c();

你会得到hi undefined因为你已经失去了函数与 b 的关系。

您可以通过执行以下任一操作来解决此问题c.bind(a)() or c.call(a)

The call函数的行为类似。这将是相同的every函数,伪代码如下所示:

class Function {
  constructor(functionDefinition) {
    this.functionDefinition = functionDefinition;
  }

  call(newThis, ...args) {
    // take this.functionDefinition, and call it with `this` and `args`
  }
}

由于您正在提取调用函数,因此它会丢失与其关联的函数对象。

您可以通过将 concat 绑定到函数或使用 call on call 来解决此问题:-)

const a = []
const boundFn = a.concat.call.bind(a.concat)
console.log(boundFn([3], [1,2]));

// Or, you can use `call` to pass in the concat function
const callFn = a.concat.call;
console.log(callFn.call(a.concat, [4], [1,2]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript:typeof表示“函数”,但它不能作为函数调用 的相关文章

  • 禁用小写字符下划线:g q p j y?

    有时您不希望下划线盲目地穿过带下划线的页面标题 有没有办法自动优雅地禁用强调对于某些小写字符 在这些情况下 最好不要在这些小写字母下划线 例如 g q p j y CSS h1 text decoration underline PAGE
  • iOS Javascript DOM“冻结?”

    这里有几个问题 有没有办法阻止 iOS 在滚动时冻结页面上的 javascript 当您在另一个选项卡中或切换应用程序时 iOS 是否会冻结 JavaScript iOS 上还有其他主要的 javascript 限制吗 iOS 6 x 会暂
  • 引发一系列事件 Backbone event:name

    extend object Backbone Events object on myalert one function msg document body innerHTML eve1 msg msg name this name con
  • 为什么Google的闭包库不使用真正的私有成员?

    我成为 JavaScript 开发人员已经有一段时间了 我一直认为在 JavaScript 中实现私有成员的正确方法是使用 Doug Crockford 在这里概述的技术 http javascript crockford com priv
  • 监听外部事件。 Bash 到 NodeJS 的桥梁

    在 NodeJS 进程内部 我如何监听来自 bash 的事件 例如 NodeJS side obj on something function data console log data Bash side do something Hel
  • 如何使用 JS/Puppeteer 上传文件

    我试图弄清楚如何将图片文件上传到输入对话框中 不可能只输入名称并按 Enter 键 因为我没有找到使用 Puppeteer 实现自动化的方法 我想我必须设置一些值作为图片 但我不知道该怎么做 有任何想法吗 您使用上传文件elementHan
  • 如何在jsp中使用javascript动态创建下拉框?

    我正在尝试动态创建下拉框 就像当我单击添加按钮时它必须创建新的下拉框 下拉列表还包含动态值 例如需要当前年份并且必须显示最多五年 请建议我这样做 谢谢 这是我尝试过的代码 JavaScript 代码 function Add var nam
  • 调用 UDF 时公式中使用的值的数据类型错误

    我一直在努力找出这里出了什么问题 我有两个包含字符串值的列 我使用第三列调用工作表中的 UDF 但最终得到 Value 并出现错误 公式中使用的值的数据类型错误 Eg Col I Col J File1 Y File1 N File2 Y
  • 当用户输入/删除时,使文本字段中的提示消失/重新出现[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁知道我怎样才能在我的搜索栏中做出
  • Angular2 - 防止复选框被选中

    我有一个每行包含一个复选框的表 在表头中 我有一个Check All切换所有表格行框的复选框 我正在尝试实现一些逻辑 如果复选框的数量将超过特定限制 则显示错误并且不切换表行复选框或checkall盒子本身 有一个问题允许checkAll即
  • 在Vue.js 3中添加全局变量

    如何在 Vue js 3 中添加全局变量 在 Vue js 2 中 我们在main js file Vue prototype myGlobalVariable globalVariable 最直接的替换就是app config globa
  • 处理照片上传的最佳方式是什么?

    我正在为一个家庭成员的婚礼制作一个网站 他们要求的一个功能是一个照片部分 所有客人都可以在婚礼结束后前往并上传他们的照片 我说这是一个很棒的想法 然后我就去实现它 那么只有一个问题 物流 上传速度很慢 现代相机拍摄的照片很大 2 5 兆 我
  • 云函数 onUpdate:无法读取未定义的属性“forEach”

    现在我正在尝试更新我的项目中的图片 我可以更新云火商店中的图片网址 但我也想使用 firebase 云功能从云存储中删除上一张图片 我想要实现的是 当我上传新图片时 从云存储中删除以前的图片 This is my data structur
  • 如何使用 Ajax 在 Flask 中发布按钮值而不刷新页面?

    我有一个问题 当我单击 Flask 应用程序中的按钮时 我想避免重新加载 我知道有 Ajax 解决方案 但我想知道如何将我的按钮链接到 ajax 函数以发布按钮值并运行链接到其值的 python 函数 这是我的 html 按钮 div di
  • 如何应对 WebStorm 中大量未解决的变量警告?

    我有一个从服务器获取数据的函数 function getData data console log data someVar 网络风暴说someVar是一个未解决的变量 我怎样才能摆脱这样的警告 我看到几个选项 禁止 IDE 设置中的警告
  • Javascript For 循环在 dom 元素上执行[重复]

    这个问题在这里已经有答案了 我有 javascript 代码来获取具有类名称的元素 并迭代从元素中删除该类 var elements document getElementsByClassName test console log Leng
  • 如何运行 Mike Bostock 的 D3 示例?

    我一直在尝试经营迈克博斯托克透视地球仪 http bl ocks org mbostock 6747043例如 但是如果您尝试在本地重现它 则对其 json 文件的引用是不正确的 问题来自于这行代码 d3 json mbostock raw
  • Chrome + 另一个进程:进程间通信比 HTTP/XHR 请求更快?

    我有一个进程 1 对视频流进行实时图像处理 我需要在 Chrome 中的 HTML 页面中渲染该视频 同一台计算机上的进程 2 在canvas or img or videoHTML5 元素 由于我有 1000x1000 像素 x 3 字节
  • 如何在输入时格式化 contenteditable div?

    我正在尝试编写一个函数 允许 contenteditable div 在用户输入 div 时执行一些自动格式化 到目前为止我只能让它在 IE 中运行 有人可以帮助我吗 function formatOnKeyUp if window get
  • JavaScript 开关(真)

    你好 我正在尝试处理 ajax json 响应 这是我的代码 success function j switch true case j choice1 alert choice2 break case j choice2 alert ch

随机推荐

  • 检查存储过程是否正在运行?

    是否可以检查 SQL Server 中当前是否有任何存储过程正在运行 我问过一次 查看 Sql Server 2000 如何找出当前正在运行哪些存储过程 https stackoverflow com questions 129086 sq
  • Razor 视图中的内联 If

    在我的控制器中 我有内联 If 语句 ViewBag NameSortParam If String IsNullOrEmpty sortOrder Name desc 在我看来 如果出现以下情况 我似乎无法使用内联 Code If Tru
  • Apache2启动失败,无错误日志

    我会重新启动 Apache2 但出现错误 sudo service apache2 start Starting web server apache2 Action start failed The Apache error log may
  • 将数据插入多个表 PHP MySQL

    我有一个用于存储食谱的基本数据结构 它由三个表组成 如下所示 表 1 食谱 recipe id recipe name 表 2 成分 成分 ID 成分名称 表 3 配方 成分 配方 id 成分 id 我在添加新配方时遇到问题 想知道插入的最
  • 使用 CSS 首字下沉

    我怎样才能使每个段落的第一个字符看起来像这样 我更喜欢只使用 CSS p first letter float left font size 5em line height 0 5em padding bottom 0 05em paddi
  • 从 C++ 代码自动生成流程图 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要自动地用 C 代码构造流程图 最好每个源文件一个流程图 有没有任何工具 最好是 C Python
  • 批量设置变量=%变量:~1%是什么意思

    谁能解释一下是什么 1 在批处理文件中的以下语句中 我分配的值 variable到服务器名称并尝试过echo variable 我得到与输出相同的服务器名称 谁能解释一下下面的语句是如何工作的 set variable variable 1
  • 如何使用 Kinect 追踪一个人 (trackingID)

    我想跟踪第一个人 并使用这个人的右手在我制作的应用程序中导航 我可以接管光标 现在我只想跟踪一个人 因此 基本上 当一个人在程序中导航时 有人走在他身后或与这个人一起看 如果他们移动 kinect 不应该识别其他任何人 我怎样才能实现这个
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 在 JSF 应用程序中通过反射读取托管 Bean 的内容

    我想以自动生成的方式打印出支持 bean 的内容 所以所有的内容都出现在一个JSP上 无论如何 这可能吗 提前致谢 丹尼尔 一种方法是使用JavaBean API http java sun com javase 6 docs api ja
  • mysqli_result 无法转换为 int [重复]

    这个问题在这里已经有答案了 我想将 SQL COUNT 的结果存储在变量中 然后将它们相除 但是出现错误 注意 类 mysqli result 的对象在 中无法转换为 int countrows SELECT count AS NumRow
  • ArrayAdapter.getCount() NullPointerException

    我的 Android 应用程序中有以下代码 protected ArrayList
  • C# - 日期时间构造函数调用

    所以 我有这个程序 它有一个输入为 DateTime 的构造函数 但是每当我尝试创建该类的对象并传递 DateTime 作为参数时 就会出现错误 代码如下 public Student DateTime dob DateofBirth do
  • Code First:避免鉴别器列并保留继承

    在我的项目中我有 public class BaseEntity Key public int Id get set 然后我必须定义 10 多个 POCO 类来定义数据库中的表 public class MyTable BaseEntity
  • plm回归中的错误

    同事 我有面板数据 Company year Beta NI Sales Export Hedge FL QR AT Foreign 1 1 2010 2 2052800 293000 1881000 78 6816 0 23 5158 1
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 如何创建或稳定 FMDB 中两个表之间的关系?

    我是 iOS 开发新手 也是 SQLITE 数据库新手 我在我的项目中使用 FMDB 作为包装器 我有两个表 1 ParticepentsTable and 2 ExerciseTable ParticepentsTable包含 4 行 例
  • SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 laravel 9

    尝试分配外键 但是当您运行迁移时 我收到此错误 我不明白问题是什么 SQLSTATE HY000 一般错误 1215 无法添加外键约束 SQL alter tablecategories添加约束categories parent key f
  • 有没有办法找出我尚未同步的变更集?

    在 TFS 中我可以这样做 gt tf get preview 找出自上次同步以来哪些文件已更改 但我想知道这些文件更改属于哪些变更集 类似 tf历史记录 的输出应用于我缺少的更改 有内置的方法可以做到这一点吗 注意 我是一个命令行人员 因
  • Javascript:typeof表示“函数”,但它不能作为函数调用

    这次我对 Javascript 真的很困惑 var x Array prototype concat call typeof x function x Uncaught TypeError x is not a function 这里到底发