你如何得到这个"这个"功能?

时间:2015-02-01 02:31:54

标签: javascript function this

如何从函数外部获取函数的this值,而不必调用它?例如,以下内容不起作用,但说明了这个想法:

// window is this, currently
function foo() {}
console.log(foo.this) // would log the window object.

Function.bind()的MDN文档报告bind()"创建了一个新功能,在调用时,将其关键字设置为提供的值"。这意味着每个函数都有一个"这个"从ery开始就与之相关联。

问题在于是否"这个"可以从函数调用之外访问,因为可能是它"这个"已经存在基于MDN文档的引用。

在您的控制台中尝试此操作:

var foo = function() {}
var bar = foo.bind(this)
console.log(foo === bar)

结果为false,这意味着您现在有两个功能,而不是一个,每个功能都拥有this

有些人提到了#34; callsite"确定函数的this,它似乎不是真的。如果你运行

var obj = {}
function foo() {
  console.log(this)
}
function Obj(func) {
  console.log(this)
  func()
}
new Obj(foo)

然后foo的callsite位于new Obj内,但它仍然记录Window对象。

如果你跑

var obj = {}
function foo() {
  console.log(this)
}
foo()
foo.call(obj)
foo.bind(obj)
foo()

然后你会注意到原始foo函数的this没有改变。基于这一事实以及bindcallapply的MDN文档,我们可以自信地假设函数的this永远不会被更改。

3 个答案:

答案 0 :(得分:3)

这个可以根据您调用函数的方式进行更改,因此,没有真正的方法可以将其置于函数之外。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

答案 1 :(得分:2)

没有办法获得this的值,因为this实际上并不与函数对象相关,而是与执行上下文相关联函数被调用。

execution context具有以下属性:

  

<强> LexicalEnvironment
  标识用于解析此执行上下文中的代码所做的标识符引用的词法环境。

     

<强> VariableEnvironment
  标识词法环境,其环境记录包含由此执行上下文中的VariableStatements和FunctionDeclarations创建的绑定。

     

<强> ThisBinding
  与此执行上下文关联的ECMAScript代码中与this关键字关联的值。

现在,当一个函数被称为时,the following steps take place

  

10.4.3 Entering Function Code
  当控件进入函数对象 F 中包含的函数代码的执行上下文,调用者提供的 thisArg 和调用者提供的 argumentsList :

     
      
  1. 如果function codestrict code,请将ThisBinding设置为 thisArg
  2.   
  3. 如果 thisArg null undefined ,请将ThisBinding设置为global object
  4.   
  5. 否则如果Type( thisArg )不是Object,则将ThisBinding设置为ToObject( thisArg )。
  6.   
  7. 否则将ThisBinding设置为 thisArg
  8.   
  9. localEnv 成为调用NewDeclarativeEnvironment传递 F 的[[Scope]]内部属性值作为参数的结果。
  10.   
  11. 将LexicalEnvironment设置为 localEnv
  12.   
  13. 将VariableEnvironment设置为 localEnv
  14.   
  15. 代码 F 的[[代码]]内部属性的值。
  16.   
  17. 使用function code 代码 argumentList 执行声明绑定实例化,如10.5中所述。
  18.   

特别注意

  

[...]来电者提供 thisArg [...]

这应该明确this的值由函数的调用者提供

示例:

当一个函数被调用为foo()时,则没有thisArg,因此它是undefined。在这种情况下,执行步骤2并将this绑定到全局对象。

但是,如果某个函数被称为foo.call(bar),则thisArgbar,并且会发生第3步或第4步,具体取决于bar是对象还是不

我希望这可以解释为什么无法获得函数的this值。

答案 2 :(得分:-1)

你需要一些功能帮助。

function foo(){
    return this;
};
console.log(foo());