您可以获取通过其调用函数的属性名称吗?

bgoldst

我已经进行了很多搜索,并且还玩得很开心,而且我很确定这个问题的答案是否定的,但是我希望JavaScript专家可能会花一些时间来做到这一点。

一个JavaScript函数可以被多个属性引用,即使在完全不同的对象上也是如此,因此不存在持有该函数对象或属性。但是,每次实际调用函数时,都必须通过单个对象(至少是window用于全局函数调用对象)和该对象的属性来实现。

(也可以通过函数局部变量来调用函数,但是我们可以将函数局部变量视为作用域的激活对象的属性,因此该情况​​也不是该规则的例外。)

我的问题是,有没有办法让被用来调用的函数,从属性名内部函数体?我不想将属性名称作为参数传递,也不想在封闭范围内的变量周围传递闭包,也不想将名称作为单独的属性存储在持有函数引用并让函数访问该名称属性的对象上的this对象。

这是我想做的一个例子:

var callName1 = function() { var callName = /* some magic */; alert(callName); };
var obj1 = {'callName2':callName1, 'callName3':callName1 };
var obj2 = {'callName4':callName1, 'callName5':callName1 };

callName1(); // should alert 'callName1'
obj1.callName2(); // should alert 'callName2'
obj1.callName3(); // should alert 'callName3'
obj2.callName4(); // should alert 'callName4'
obj2.callName5(); // should alert 'callName5'

通过我的搜索,看起来最接近上述内容的是arguments.callee.name,但这是行不通的,因为它仅返回在定义函数对象时固定在函数对象上的名称,并且仅在将其定义为a时才返回。命名函数(在我的示例中不是)。

我还认为,也许您可​​以遍历this对象的所有属性并测试是否相等,arguments.callee以找到其值是对函数本身的引用的属性,但是(在一般情况下)也不起作用,因为有可能在我自己的示例中,是对象自身(或继承)属性集中对该函数的多个引用。(此外,这似乎是一种低效的解决方案。)

能做到吗?

羊皮的

简短答案:

  1. 不,您无法获得用于调用函数的“属性名称”。
  2. 可能根本没有名称,或者在不同范围内有多个名称,因此“属性名称”定义得很糟糕。
  3. arguments.callee 已弃用,不应使用。
  4. 没有不使用参数或闭包的解决方案。

长答案:

正如thefourtheye所评论的那样,您应该重新考虑您要做什么,并在一个新问题中提出这个问题。但是,存在一些常见的误解,因此,我将尝试解释为什么您无法获得“简单属性名称”。

原因是因为它并不简单。

在继续之前,让我们澄清一些事情。激活对象根本不是对象ECMAScript 5.1规范将其称为Environment Records (10.2.1),但更通用的术语是Scope chain在浏览器在全球范围(通常)的window对象,但所有其他范围都没有对象。可能是你用来调用函数的对象,当你调用一个函数,你必须在一定范围内

除少数例外,范围不是对象,并且对象不是范围。

然后,有很多名字。

  • 调用函数时,需要引用它,例如通过对象属性。此引用可能有一个名称。
  • 范围链具有声明,该声明始终具有一个名称。
  • 一个Function(真正的函数,而不是引用)可能也有一个函数名-你arguments.callee.name-这是固定在声明。

它们不仅具有不同的名称,而且(并非总是)您要查找的“属性名称”。

var obj = { prop : function f(){} }, func = obj.prop;
// "obj" and "func" are declarations.
// Function name is "f" - use this name instead of arguments.callee
// Property name is "prop"
func();     // Reference name is "func"
obj.prop(); // Reference names are "obj" and "prop"
// But they are the same function!
// P.S. "this" in f is undefined (strict mode) or window (non-strict)

因此,函数引用可能来自binding(例如,函数声明),Object(arguments.callee)或variable它们都是References (8.7)并且引用确实有一个名字(可以这么说)。

问题是,函数引用并不总是来自对象或作用域链,并且其名称也不一定总是定义的。例如,一种常见的关闭技术:

(function(i){ /* what is my name? */ })(i)

即使引用确实具有名称,函数调用(11.2.3)也不会以任何方式将引用或其名称传递给函数。这使JavaScript引擎保持理智。考虑以下示例:

eval("(new Function('return function a(){}'))()")() // Calls function 'a'.

最终的函数调用引用eval函数,该引用引用新的全局范围的结果(无论如何严格模式下),引用一个函数调用语句,引用一个组,引用一个匿名的Function对象,并且包含包含以下代码的代码:表示并返回一个称为“ a”的函数。

如果要从一个内部获取“属性名称”,应该获取哪个名称?“评估”?“功能”?“匿名的”?“一种”?他们都是?在回答之前,请考虑一下复杂性,例如跨iframe的函数访问(具有不同的全局变量以及跨原点限制),或者与本机函数的交互(Function.prototype.bind例如),您将看到它如何迅速变成地狱。

这也是为什么arguments.caller__caller__以及其他类似的技术,现在都过时了。函数的“属性名称”比调用者定义得更糟,几乎是不现实的。至少调用者始终是执行上下文(不一定是函数)。

因此,不知道您的真正问题是什么,获得“属性名称”的最佳选择是使用闭包。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

您可以获取通过其调用函数的属性名称吗?

来自分类Dev

您可以使用变量的值作为函数名称来调用函数吗?

来自分类Dev

您可以通过确定对象名称来从Linq返回POCO对象的属性吗?

来自分类Dev

您可以将javascript函数名称设置为html属性吗?

来自分类Dev

您可以通过传递类来更改其值吗?

来自分类Dev

您可以在c中的函数的callong中调用函数吗

来自分类Dev

我可以通过数字/ id而不是名称来获取Powershell对象的笔记属性吗?

来自分类Dev

有什么方法可以通过Xpath获取元素属性名称吗?

来自分类Dev

通过其属性名称获取选择框的值

来自分类Dev

如果Javascript对象的某个属性包含对函数的引用,那么我可以从函数内部获取该属性名称吗?

来自分类Dev

函数可以从先前的调用中访问其变量吗?

来自分类Dev

可以在调用函数参数之前对其进行设置吗?

来自分类Dev

是否可以通过命名其参数在Rust中调用函数?

来自分类Dev

通过函数调用JavaScript获取对象调用者名称

来自分类Dev

我可以通过使用其网址获取Blob吗?

来自分类Dev

您可以启用R函数在评估时查看其自身形式的值吗?

来自分类Dev

您可以将对象添加到其构造函数内部的数组中吗

来自分类Dev

您可以从被调用方获取调用方DLL或可执行模块吗

来自分类Dev

您可以从 PostgreSQL 中的另一个函数调用 call perform/do 函数吗?

来自分类Dev

是否可以通过设置函数的属性来调用函数?

来自分类Dev

您可以通过App.config文件更改C#Winforms按钮的名称吗?

来自分类Dev

您可以通过发布任务修改SBT构建的名称和版本吗?

来自分类Dev

您可以通过CSS选择具有相同名称的更多类的元素吗?

来自分类Dev

您可以使对象“可调用”吗?

来自分类Dev

我可以在f#中按名称调用函数吗?

来自分类Dev

(命名的)函数可以内省它被调用的名称吗?

来自分类Dev

可以通过字符串名称调用函数

来自分类Dev

您可以遍历雄辩对象的属性吗?

来自分类Dev

<option>可以有多个名称吗?获取<option>的数据属性?

Related 相关文章

  1. 1

    您可以获取通过其调用函数的属性名称吗?

  2. 2

    您可以使用变量的值作为函数名称来调用函数吗?

  3. 3

    您可以通过确定对象名称来从Linq返回POCO对象的属性吗?

  4. 4

    您可以将javascript函数名称设置为html属性吗?

  5. 5

    您可以通过传递类来更改其值吗?

  6. 6

    您可以在c中的函数的callong中调用函数吗

  7. 7

    我可以通过数字/ id而不是名称来获取Powershell对象的笔记属性吗?

  8. 8

    有什么方法可以通过Xpath获取元素属性名称吗?

  9. 9

    通过其属性名称获取选择框的值

  10. 10

    如果Javascript对象的某个属性包含对函数的引用,那么我可以从函数内部获取该属性名称吗?

  11. 11

    函数可以从先前的调用中访问其变量吗?

  12. 12

    可以在调用函数参数之前对其进行设置吗?

  13. 13

    是否可以通过命名其参数在Rust中调用函数?

  14. 14

    通过函数调用JavaScript获取对象调用者名称

  15. 15

    我可以通过使用其网址获取Blob吗?

  16. 16

    您可以启用R函数在评估时查看其自身形式的值吗?

  17. 17

    您可以将对象添加到其构造函数内部的数组中吗

  18. 18

    您可以从被调用方获取调用方DLL或可执行模块吗

  19. 19

    您可以从 PostgreSQL 中的另一个函数调用 call perform/do 函数吗?

  20. 20

    是否可以通过设置函数的属性来调用函数?

  21. 21

    您可以通过App.config文件更改C#Winforms按钮的名称吗?

  22. 22

    您可以通过发布任务修改SBT构建的名称和版本吗?

  23. 23

    您可以通过CSS选择具有相同名称的更多类的元素吗?

  24. 24

    您可以使对象“可调用”吗?

  25. 25

    我可以在f#中按名称调用函数吗?

  26. 26

    (命名的)函数可以内省它被调用的名称吗?

  27. 27

    可以通过字符串名称调用函数

  28. 28

    您可以遍历雄辩对象的属性吗?

  29. 29

    <option>可以有多个名称吗?获取<option>的数据属性?

热门标签

归档