相当于 php call_user_func 的 javascript

2024-04-18

我发现了我已经实现的这个主题(参见已接受的答案):
相当于 PHP 的 call_user_func() 的 JavaScript https://stackoverflow.com/questions/5818313/javascript-equivalent-of-phps-call-user-func

但是,我遇到了多个参数的问题。我意识到我所做的是将参数转换为字符串并将其视为 1 个参数,但我不知道如何解决此问题,因为我正在动态创建参数。

意思是,我在代码中定义了以下内容:

var a = new Array();
a[0] = new Array();
a[0][0] = 'alert';
a[0][1] = '\'Hello World\'';
a[1] = new Array();
a[1][0] = 'setTimeout';
a[1][1] = 'alert("goodbye world")';
a[1][2] = '20';

后来我是这样称呼他们的:

    var j = 0;
    var len = 0;
    var fx = '';
    var params = '';
    for( i in a ){
        params = '';
        len = a[i].length;
        fx = a[i][0]; // getting the function name
        a[i].splice( 0, 1 ); // removing it from array
        if( len > 1 ){
            params = a[i].join(", "); // trying to turn the parameters into the right format, but this is turning it into strings I think
            params = params.replace(/\\'/g,'\''); // bc i was adding slashes with PHP
        }
        window[fx](params);
    }

我不必使用数组来做到这一点。我不明白 JS OOP(还没有尝试过),尽管我对 PHP OOP 很满意,所以我不知道是否有办法在那里做到这一点。

任何有关传递多个参数的帮助将不胜感激。

Thanks.


首先要做的事情:废弃整个代码,重新开始。你的方法不会让你到达你想去的地方。 (不幸的是,我无法告诉你你想去哪里,因为我无法理解你的例子。)

JavaScript 中有三种调用函数的方法。

function foo() { console.log(arguments); }

// 1. directly
foo(1, 2, 3);

// 2. trough Function.call()
foo.call(this, 1, 2, 3);

// 3. trough Function.apply()
var args = [1, 2, 3];
foo.apply(this, args);

call and apply是相似的。他们让你决定哪个对象this关键字将指向函数内部(这是重要的一点!)。

apply接受参数数组,call接受个别论点。

最接近的东西call()是 PHP 的call_user_func()。最接近的东西apply()是 PHP 的call_user_func_array().

JavaScript 对象与 PHP 数组有一些共同之处:它们都是键/值对。

// an anonymous function assigned to the key "foo"
var obj = {
  foo: function () { console.log(arguments); }
};

这意味着您可以使用点符号访问对象属性:

// direct function call
obj.foo(1, 2, 3);

或者通过方括号表示法(注意对象键是字符串):

var funcName = "foo";
obj[funcName](1, 2, 3);
obj[funcName].call(obj, 1, 2, 3);
obj[funcName].apply(obj, [1, 2, 3]);

方括号表示法使您可以自由地动态选择对象属性。如果这个属性恰好是一个函数,apply()让您可以自由地动态选择函数参数。

每个尚未声明为某个对象的属性的顶级函数都将成为该对象的属性global目的。在浏览器中全局对象是window。 (所以function foo()在我上面的第一个代码块中确实是window.foo.)

注意this不像 PHP 那样工作。它将指向该函数的对象已被召唤,而不是函数“所属”的对象。 (“属于”这个概念在 JavaScript 中并不真正存在。事物可以用这种方式建模,但这只是一个约定。)

直接调用(obj.foo(1, 2, 3)), this将指向obj. With call and apply, this将指向您想要指向的任何对象。这比乍听起来有用得多。大多数时候,当你想动态调用函数时,你最终会使用apply.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相当于 php call_user_func 的 javascript 的相关文章

  • 如何在 jquery 上并排区分 mouseout/leave 事件?

    有没有办法知道鼠标事件是否已从元素的特定一侧离开 我的意思是 我有一个带有 mouseover mouseenter 事件的 DIV 并且我只想在鼠标离开到元素的左侧时触发该操作DIV 并向右 但如果它从底部或顶部离开 则不应触发任何操作
  • 解析 Angular2 中的 xml 以在视图中呈现

    我是否需要解析 xml 以从 xml 获取数据以在 html 中呈现 我目前正在使用获取本地 xml 文件http get请求并在控制台日志中显示 xml 文件中的所有信息 我认为它只是在读取它 问题是如何在angular2中将xml转换为
  • 我在 firebase.auth.ApplicationVerifier 中遇到问题

    错误发生在signInWithPhoneNumber 的第二个参数中 我无法解决这个问题 我使用了三种方法来发送 otp 验证 otp 和最后用于验证码 methods sendOTP e e preventDefault if this
  • jquery $('id').text 带粗体

    我有一个 jquery 可以更改链接的文本 如下所示 if urlfind gt 0 linkurl text More info 和 HTML a href a 我试图为此链接添加粗体 但添加 b More Info b 让它们在文本本身
  • 如何修复 Eslint 错误“prefer-destructuring”?

    我想像这样缩短 ES6 中的对象文字 const loc this props local 原因是loc foo 比打字容易得多this props local foo 但现在 ESLint 抱怨道 使用对象解构 prefer destru
  • 如何观察Firebase存储上传事件

    我有一个将照片上传到 Firebase 存储的 iOS 应用程序 以及一个连接到同一个 Firebase 的 Web 应用程序 有没有办法从网络上观察存储的变化 当上传照片时 只有iOS设备本身可以访问UploadTask 并且我没有看到o
  • 这个作用域/闭包什么时候在 javaScript 中被垃圾回收?

    我正在做一门课程 该课程正在讨论范围 闭包并简要提到垃圾收集 课程中提出一个问题 范围保持多久 答案是 直到 不再有任何提及它 是的 所以我们基本上说的是 是的 闭包有点像对隐藏范围对象的引用 所以只要有一些函数仍然有一个闭包 范围 该范围
  • 将数组传递给 include() javascript

    我试图找出一个字符串是否包含存储在数组中的多个字符串 includes 所以我尝试过 let string hello james console log string includes hello james 但它被返回为false 当我
  • angular.isdefine 有什么好处?

    有什么好处angular isdefined超过和超过foo undefined 我一时想不出有什么好处 在 Javascript 中以任何方式访问真正未定义的变量 除了 typeof 都会抛出错误 你只能使用Angular isDefin
  • 将数据发送到 parse.com 并更新 Angular $scope

    我正在将数据发送到 parse com 上的类 我想运行此函数并更新 scope无需重新加载视图 创建一个Programme运行下面的函数工作正常 但是有时在创建新程序后不会更新视图 并且需要刷新页面 当调用整个函数时 如底部所示 getP
  • 我应该担心“窗口未定义”JSLint 严格模式错误吗?

    这不会在严格模式下通过 JSLint use strict function w w alert w window 来自 jslint com 的错误如下所示 第 4 行第 3 行字符出现问题 window 未定义 window 隐含全局
  • 如何将对象传递给 onclick 事件[重复]

    这个问题在这里已经有答案了 可能的重复 Javascript 循环内的事件处理程序 需要闭包吗 https stackoverflow com questions 341723 event handlers inside a javascr
  • 什么是 TypeScript?为什么我要用它代替 JavaScript? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您能描述一下 TypeScript 语言是什么吗 它能做什么 JavaScript 或可用库不能做的事情 这让我有理由考虑它 我最初写
  • 如何将java数组列表转换为javascript数组? [复制]

    这个问题在这里已经有答案了 我们如何将 String 对象的 java arraylist 转换为 javascript 数组 这就是我正在做的事情 但我正在寻找更好的方法来做到这一点 我不想迭代数组列表 var myArray
  • 如何暂时停止标题属性显示工具提示?

    我在右键单击时显示了一个弹出 div 我知道这会破坏预期的功能 但 Google 文档会这样做 所以为什么不呢 但是 我在弹出窗口上显示的元素有一个 标题 属性集 该属性集出现在我的分区 我仍然希望工具提示能够工作 但当弹出窗口出现时就不行
  • 如何以编程方式移动 OpenLayers Vector?

    API 文档为OpenLayers Feature Vector http dev openlayers org apidocs files OpenLayers Feature Vector js html说 Vector 本身根本没有方
  • 是否包括触摸事件客户端X/Y 滚动?

    我正在尝试获取相对于的触摸坐标viewport来自触摸事件的浏览器 例如触摸启动 我尝试从 clientX Y 属性获取它们 但两者实际上都返回包括滚动在内的值 这是违反规范的 因为它说 clientX Y 应该返回坐标而不滚动 我尝试添加
  • ES6 - 有没有一种优雅的方法来导入所有命名导出而不是默认导出?

    我正在寻找一种优雅的方法来导入所有命名导出 而不必导入默认导出 在一个文件中 我导出许多命名常量以及默认值 myModule js const myDefault my default export const named1 named1
  • 如何在禁用按钮上启用 Bootstrap 工具提示?

    我需要在禁用的按钮上显示工具提示 并在启用的按钮上删除它 目前 它的工作原理是相反的 扭转这种行为的最佳方法是什么 rel tooltip tooltip
  • Javascript - 从 AWS s3 存储桶读取镶木地板数据(使用快速压缩)

    In nodeJS 我正在尝试读取镶木地板文件 压缩 snappy 但没有成功 I used https github com ironSource parquetjs https github com ironSource parquet

随机推荐

  • 在 silverlight 中保存文件和异步回调

    在 Silverlight 中 您必须使用保存文件对话框来保存文件 您只能通过用户事件 即按钮单击 打开此对话框 我从 Web 服务调用异步返回文件数据 我如何将其保存到文件 如果我在服务调用之前询问他们 我将无法在数据返回后使用该流 如果
  • OpenJDK 8:无法解析主机名

    我正在尝试奔跑slf4j with log4jopenJDK 8 上的 2 8 Ubuntu 上的最新版本8u131 b11 0ubuntu1 17 04 1 当通过 maven openjdk 运行简单的 java 类时 无法解析本地主机
  • 如何读取cassandra数据而不区分大小写

    我需要从 cassandra 获取数据而不区分大小写 请帮我 Cassandra 中没有区分大小写的概念 所有数据都存储为byte 所以它甚至不是一个字符串 您可以制作自定义比较器 参见API http wiki apache org ca
  • 如何在 Excel 中根据验证结果进行条件格式设置?

    如果单元格无效 我想更改单元格的格式 在这种情况下 有效 意味着单元格未通过数据验证规则 我问这个问题是因为我在SO上找不到答案 我最终解决了它 我将发布我的答案 看看人们是否愿意发表评论或提供更好的答案 这是一个基本大纲 我想在本周晚些时
  • 局部变量和全局变量默认是如何初始化的?

    根据以下内容 我对吗 global A 引用被初始化为 null global int 为 0 local A 引用为空 local int 未初始化 global A x 和 local A x 均未初始化 谢谢你的帮助 A global
  • 如何在 IDE 中使用 Grails 依赖项

    So I finally https stackoverflow com questions 1867064 grails and local maven dependencies让我的依赖项与 Grails 一起工作 现在 我的 IDE
  • 如何创建行列总和为 1 和 0 的对称矩阵

    我试图找到一种优雅的算法来创建 1 和 0 的 N x N 矩阵 但有以下限制 每行每列之和必须为Q 可自由选择 对角线必须是 0 矩阵必须是对称的 矩阵不一定是随机的 然而 随机和非随机解都很有趣 因此对于 Q 偶数 只需使每一行成为向量
  • Spring验证字符串值是JSON

    我的配置文件中有一些值 它应该是 JSON 它将作为字符串加载 我希望 Spring 在注入之前验证该值确实是有效的 JSON 否则会抛出错误 我已经阅读了现有的验证注释 例如 NotNull Size Min Max Email NotE
  • 使用 Read::read_to_string 从 TcpStream 读取会挂起,直到远程端关闭连接

    我正在尝试实施Haskell IRC 机器人教程 https wiki haskell org Roll your own IRC bot在 Rust 中 我在阅读连接后服务器发送给我的内容时遇到一些困难 似乎发生的情况是 我连接并从服务器
  • C 中正确的 Hello World [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正确的 C 语言 Hello World 程序是什么 从第一页开始 c 你好世界 的 Google 搜索结果 http www google c
  • 离线时如何将数据写入firebase?斯威夫特3

    在 tableView 中我有一个工作列表 这些作业可以由多个用户访问 因此我需要使用 FIRTransaction 根据第一次写入 FirebaseDatabase 的结果 我需要写入 不写入 Firebase 中的另一个路径 架构如下
  • Firebase 通知主题的限制

    我想为我的 Android 应用程序使用 Firebase 通知 我想知道主题数量是否有限制 或者可以订阅某个主题的用户数量 例如 我可以有 10000 个主题 每个主题有 100 万用户吗 主题或订阅的数量没有限制 主题最初推出后第一年的
  • 自己的图像作为范围内的滑块拇指。如何在CSS上设置样式

    如何使用 css 将图像设置为范围输入类型上的拇指滑块 它在 Internet Explorer 中不起作用 Chrome 和 Firefox 没问题 但在 IE 上我的图像被隐藏了还是怎么的 我用 ms thumb 并尝试将图像设置为背景
  • 使用 TEXT 或 VARCHAR 哪种 DATATYPE 更好?

    这个问题基于两件事表现 and size 使用 TEXT 或 VARCHAR 哪种 DATATYPE 更好 基于哪些性能会影响哪些性能会得到改善 这取决于你用它做什么 我不想给出如此笼统的答案 但这是事实 一般来说 尝试尽可能具体地获取数据
  • 调试时会忽略依赖项 org.apache.httpcomponents:httpclient:4.5,因为它可能与提供的内部版本冲突

    我试图将图像上传到服务器 由于我是 Android 新手 我正在尝试使用其他代码 这是我的错误 错误文件 https i stack imgur com rZnw6 jpg 这是我的活动文件 import android app Activ
  • Excel、ActiveCell.Row 取决于单击与按 Enter 键

    我的工作表中有 VBA 代码 它是工作表更改事件 Private Sub Worksheet Change 在此工作表上 我有带有数据验证的下拉菜单 所以我可以选择一个下拉菜单并选择 水果 做出选择后 工作表更改事件会记录我当前所在的行 并
  • Flex - 将滚动条的位置更改为 Horizo​​ntalList 组件的顶部

    默认情况下 Horizo ntalList 组件的水平滚动条位于底部 有没有办法重新定位它 使其位于顶部 为了清楚起见 我并不是指使用scrollToIndex或horizo ntalScrollPosition或类似的方法移动滚动位置 而
  • 在 Flex 中将字符串模式解析为日期

    flex 中是否有某种方法可以解析迄今为止的字符串 我希望它支持类似于 dateformatter 的自定义格式 使用 dateformatter 类 我们可以解析 formatString property 指定的各种字符串格式的日期对象
  • 您可以在 64 位 Windows 7 上使用 Mercurial “推送”到网络共享吗?

    我们正在从 Windows XP x86 升级到 Windows 7 x64 我正在测试当前工作流程的兼容性问题 目前 我们将中央 Mercurial 存储库存储在网络共享上 将副本克隆到我们的工作站 并将更改推送回基于网络的存储库 这在
  • 相当于 php call_user_func 的 javascript

    我发现了我已经实现的这个主题 参见已接受的答案 相当于 PHP 的 call user func 的 JavaScript https stackoverflow com questions 5818313 javascript equiv