当前位置: 首页 > 面试题库 >

如何将此上下文传递给函数?

吕霍英
2023-03-14
问题内容

我以为这是我可以轻松搜索的东西,但也许我没有问正确的问题…

如何在给定的javascript函数中设置“ this”所指的内容?

例如,与大多数jQuery函数一样,例如:

$(selector).each(function() {
   //$(this) gives me access to whatever selector we're on
});

如何编写/调用自己的独立函数,并在调用时具有适当的“ this”引用?我使用jQuery,因此,如果有jQuery特定的方式可以做到,那将是理想的选择。


问题答案:

Javascript .call().apply()方法允许您设置函数的 上下文

var myfunc = function(){
    alert(this.name);
};

var obj_a = {
    name:  "FOO"
};

var obj_b = {
    name:  "BAR!!"
};

现在您可以致电:

myfunc.call(obj_a);

哪个会警惕FOO。相反,通过obj_b将使人警觉BAR!!.call()和之间的区别.apply()是,.call()如果要将参数传递给函数并.apply()需要一个数组,则需要用逗号分隔的列表。

myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);

因此,您可以hook使用该apply()方法轻松编写函数。例如,我们要向jQuerys
.css()方法添加功能。我们可以存储原始函数引用,使用自定义代码覆盖函数并调用存储的函数。

var _css = $.fn.css;
$.fn.css = function(){
   alert('hooked!');
   _css.apply(this, arguments);
};

由于magicarguments对象是类似于对象的数组,因此我们可以将其传递给apply()。这样,我们保证所有参数都传递给原始函数。



 类似资料:
  • 如何在不使其成为单独变量的情况下传递数组?例如,我知道这是有效的: 但我不想让数组成为变量,因为它只在这里使用。有没有办法做到这一点:

  • 问题内容: 上周受本文启发,我正在重构我必须更明确地将上下文(数据库池,会话存储等)传递给处理程序的应用程序。 但是,我遇到的一个问题是,如果没有全局模板映射,我的自定义处理程序类型(要满足)上的方法将无法再访问该映射以呈现模板。 我需要保留全局变量,或者将我的自定义处理程序类型重新定义为结构。 有没有更好的方法来实现这一目标? func.go struct.go 有没有更干净的方法将实例传递给?

  • 问题内容: 这个问题一定很明显,但我不知道。 在模板中,我链接到媒体目录中的js文件。从该文件中,我想访问一个{{my_chart}}之类的上下文变量。 问题答案: 我认为这样不可能。如果要访问视图提供的某些数据,则必须将其传递给js函数。 例 js文件: 视图 希望这可以帮助 :)

  • 问题内容: 这似乎是一个愚蠢的问题,但是我是这个话题的新手。我正在致力于关于节点js的承诺。我想将参数传递给Promise函数。但是我不知道。 而功能类似于 问题答案: 将Promise包裹在一个函数中,否则它将立即开始工作。另外,您可以将参数传递给函数: 然后,使用它: ES6: 用:

  • 我正在尝试将一个项目迁移到Android Room。阅读了Android Room文档后,我注意到Singleton适合访问我的数据库。 Android开发者的报价: 注意:如果您的应用程序在单个进程中运行,则在实例化AppDatabase对象时应遵循单例设计模式。每个RoomDatabase实例都相当昂贵,您很少需要在单个进程中访问多个实例。 我编写了以下代码: 只是一个简单的双重检查锁定单例。