在 JavaScript 中获取调用者上下文是否可行?

在 JavaScript 中,我们经常需要访问函数调用的上下文信息,例如处理事件的对象或执行函数的元素。但是,在某些情况下,我们可能想要访问调用函数的上一级函数或作用域的上下文信息,这时候就需要获取调用者上下文了。

直接获取调用者上下文的方法

在 JavaScript 中,获取函数调用的上下文很容易,可以使用 this 关键字来获取当前函数的执行环境。然而,获取调用者上下文并不那么直接,因为 JavaScript 并没有提供一种内置的方式来获取它。

尽管如此,我们仍然可以通过以下几种方式来获取调用者上下文:

1. 使用 arguments.callee.caller 属性

在早期版本的 JavaScript 中,可以使用 arguments.callee.caller 来获取当前函数的调用者。这个属性返回当前正在执行的函数的调用栈中的下一个函数,也就是调用当前函数的函数。可以在代码中使用类似下面的方式来获取调用者上下文:

-------- ----- -
  ------
-

-------- ----- -
  -------------------------------------
-

------ -- -- - -----

然而,这种方法已经被废弃了,因为在严格模式下,arguments.callee 是被禁用的,所以不能再使用它来获取上一级函数的引用。

2. 使用 Error 对象的 stack 属性

另一种获取调用者上下文的方法是使用 Error 对象的 stack 属性。每个 Error 对象都有一个 stack 属性,它包含了一个字符串,其中包括了函数调用栈的信息。我们可以通过创建一个 Error 对象并访问其 stack 属性来获取当前函数的调用栈信息,然后从中提取出调用者上下文信息。可以在代码中使用类似下面的方式来获取调用者上下文:

-------- ----- -
  ------
-

-------- ----- -
  --------------- ---------------
-

------ -- -- --------    -- --- --------------------------------    -- --- -------------------------------    -- ------ -------------------------------

这种方法能够获取调用者上下文的详细信息,但代价是比较高的,因为创建和抛出 Error 对象需要消耗不少计算资源。因此,如果只是想要获取简单的调用者信息,最好不要使用这种方法。

更好的方法:使用闭包或返回值传递参数

以上两种方法虽然可以获取调用者上下文,但它们都有缺点。那么有没有更好的方法呢?答案是肯定的,我们可以使用闭包或返回值传递参数的方式来获取调用者上下文。

1. 使用闭包

使用闭包可以让我们轻松地获取调用者上下文,而不需要使用废弃的 arguments.callee.caller 属性或昂贵的 Error 对象。我们只需要在上一级函数中将当前函数作为参数传递给下一级函数,并在下一级函数中将它保存为一个局部变量即可。这样,在下一级函数中就能够访问上一级函数的引用了。

-------- ----- -
  ---------
-

-------- ----------- -
  -------------------- -- -- - -----
-

------

使用闭包的好处是能够直接获取到调用者的引用,而且不需要创建额外的对象,因此效率比较高。

2. 使用返回值传递参数

另一种获取

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/26665