Javascript 如何得到函数的“this”?

Javascript 如何得到函数的“this”?,javascript,function,this,Javascript,Function,This,如何从函数外部获取函数的this值,而不必调用它?例如,以下内容不起作用,但说明了这一想法: // window is this, currently function foo() {} console.log(foo.this) // would log the window object. 用于绑定报告的MDN文档创建了一个新函数,该函数在调用时将其this关键字设置为提供的值。这意味着每个函数从一开始就有一个与其关联的This 问题在于是否可以从函数调用外部访问该引用,因为根据thos

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

// window is this, currently
function foo() {}
console.log(foo.this) // would log the window object.
用于绑定报告的MDN文档创建了一个新函数,该函数在调用时将其this关键字设置为提供的值。这意味着每个函数从一开始就有一个与其关联的This

问题在于是否可以从函数调用外部访问该引用,因为根据thos MDN文档,可能已经存在该引用

在控制台中尝试以下操作:

var foo = function() {}
var bar = foo.bind(this)
console.log(foo === bar)
结果为false,这意味着您现在有两个函数,而不是一个,并且每个函数都有自己的函数

有人提到,调用站点决定函数的类型,这似乎不是真的。如果你跑

var obj = {}
function foo() {
  console.log(this)
}
function Obj(func) {
  console.log(this)
  func()
}
new Obj(foo)
然后foo的callsite位于一个新的Obj中,但它仍然记录窗口对象

如果你跑

var obj = {}
function foo() {
  console.log(this)
}
foo()
foo.call(obj)
foo.bind(obj)
foo()
然后您会注意到,原始foo函数的这一点没有改变。基于这一事实,以及绑定、调用和应用的MDN文档,我们可以自信地假设函数的this永远不会更改。

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

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

您需要函数的一些帮助

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

不,无法获取该值,因为它实际上与函数对象无关,而是与调用函数时创建的执行上下文相关

具有以下属性:

词汇环境 标识用于解析代码在此执行上下文中进行的标识符引用的词汇环境

可变环境 标识其环境记录包含在此执行上下文中由VariableStatements和FunctionDeclaration创建的绑定的词法环境

此绑定 和此执行上下文关联的ECMAScript代码中和此关键字关联的值

现在,当调用函数时:

当控件为函数对象F、调用方提供的thisArg和调用方提供的ArgumentList中包含的函数代码输入执行上下文时,将执行以下步骤:

如果是,请将ThisBinding设置为thisArg。 否则,如果thisArg为null或未定义,请将ThisBinding设置为。 否则,如果TypethisArg不是对象,请将ThisBinding设置为ToObject ThisArg。 否则将ThisBinding设置为thisArg。 让localEnv作为调用的结果,并将F的[[Scope]]内部属性的值作为参数传递。 将LexicalEnvironment设置为localEnv。 将VariableEnvironment设置为localEnv。 设code为F的[[code]]内部属性的值。 使用代码和argumentList执行声明绑定实例化,如中所述。 特别注意

[…]调用方提供了此参数[…]

这应该清楚地表明,它的值是由函数的调用者提供的

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

当一个函数被称为foo时,就没有thisArg,因此它是未定义的。在这种情况下,将执行步骤2,并将其绑定到全局对象

但是,如果函数被称为foo.callbar,那么thisArg就是bar,根据bar是否为对象,执行步骤3或4


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

console.logfoo?如果不调用它,就无法从函数外部获取此函数。告诉我们你想用它做什么没有这种事。这只是根据呼叫站点设置的。窗口是这个,当前不是。这个值取决于函数的调用方式。@SLaks我想你可能错了。绑定报表的MDN文档创建了绑定到它的新函数。这意味着每个函数都有一个与其关联的This。问题在于是否可以访问。在控制台中试试这个:var foo=function{};var bar=foo.bindthis;console.logfoo==bar。结果为false。值得注意的是,您可以使用foo.bindmyThis设置“this”。很遗憾,您不能执行foo.getThis或类似操作。同样,这可能会根据调用函数的方式有所不同。在代码的某一点上,它可能是一件事,而在另一个时间,它可能是完全不同的事。这是如何工作的?如果没有调用函数,它到底是如何工作的?正如我的问题所述,没有调用它。该函数可能被调用,谁知道在哪里,在我无法访问的其他一些范围中。我可能会将其作为回调传递给某个对象,但在传递之前,我想知道它是这个值。因此,当未指定严格模式时,调用站点才起作用,因此如果函数未附加到对象,它将获得如下全局对象?但如果启用了严格模式,那么调用站点是不相关的,也是唯一可以阻止的
function foo(){
    return this;
};
console.log(foo());

函数的这一部分是指它被分配到什么对象上?关于这一点,严格模式和非严格模式之间的唯一区别是当函数被正常调用时,它指的是什么,例如foo。在非严格节点中,这将指向全局对象,在严格模式下,它将是未定义的。所有其他方式,即obj.foo、foo.call…、foo.apply…、new foo不受影响。唯一决定函数的这种类型的是它作为对象方法调用函数时所分配的对象,这只是调用函数的一种方法。每个方面都会影响这个函数的值。啊,我明白了,所以真正重要的不是调用站点代码中的位置,而是调用它的对象(如果有),例如a.foo、b.foo、foo,其中每个示例中的foo都是对同一个函数的引用,但每个都有不同的this。是的。新的foo,foo.callthisObj,foo.applythisObj,正如我已经提到的。不,callsite表示在代码中调用函数的位置。